HttpClient 사용하기 - Paramater 보내기
- Client가 서버로 요청과 함께 Paramater를 보내는 방법은 크게 Form 형태의 데이터를 보내는 방법과 JSON 형태의 데이터를 보내는 방법이 있다.
- 보통 Form 형태의 데이터는 (Key, Value) 형태의 데이터로 Http Body에 넣어서 보내고
- JSON 형태의 데이터는 String 형태로 변환해 Http Body에 넣어서 보낸다.
- Form 형태의 데이터를 보낼 때 Header는 application/x-www-form-urlencoded 로 요청을 보내고
- JSON 형태의 데이터를 보낼 때 Header는 application/json 로 요청을 보낸다.
Paramater 요청 받을 수 있는 Back-end 코드
/test/params
에 들어오는 Http 요청과 함께 오는 Paramater 내용을 찍어주는 로직을 작성해준다. Form 형태의 Paramater를 받을 때는 @RequestParam 을 이용해 데이터를 가져올 수 있다.
@PostMapping("/test/params") public ResponseEntity testParams(@RequestParam("name") String name, @RequestParam("nickname") String nickName){ log.info("=========================== start ============================"); log.info("Name : " + name); log.info("Nickname : " + nickName); log.info("============================ end =============================");
return ResponseEntity.ok().build(); }
|
요청시 보내는 Paramater 작성
- 요청시 보내는 Paramater는 NameValuePair 객체를 이용해 (Key, Value) 형태로 값을 넣어준다.
- 작성이 완료된 NameValuePair 객체를 이용해 HttpEntity 객체를 생성한다.
- HttpEntity 객체를 요청 객체 Entity에 넣어서 Http 요청을 보내면 요청시 Paramater도 같이 전달 된다.
- UrlEncodedFormEntity 를 이용해 만들어진 Entity에 대한 요청은 ContentType 이 application/x-www-form-urlencoded 으로 보내진다.
List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("name", "test")); params.add(new BasicNameValuePair("nickname", "victor"));
HttpEntity entity = new UrlEncodedFormEntity(params);
httpPost.setEntity(entity);
|
전체 소스 코드
public class JavaHttpClientParam { public static void main(String[] args) throws IOException {
BufferedReader br;
CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("http://localhost:8080/test/params");
List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("name", "test")); params.add(new BasicNameValuePair("nickname", "victor")); HttpEntity entity = new UrlEncodedFormEntity(params); httpPost.setEntity(entity);
CloseableHttpResponse response = client.execute(httpPost);
System.out.println("=========================== start ============================");
System.out.println("Http Status Code : " + response.getStatusLine().getStatusCode());
System.out.println("============================ end ============================="); } }
|
JSON 요청 보내기
Paramater 요청 받을 수 있는 Back-end 코드
/test/json
에 들어오는 Http 요청과 함께 오는 JSON 내용을 찍어주는 로직을 작성해준다.
- JSON 형태의 Paramater를 받을 때는 @RequestBody 을 이용해 Request Body 내 데이터를 가져올 수 있다.
@PostMapping("/test/json") public ResponseEntity testJsonParams(@RequestBody TestParam param){ log.info("=========================== start ============================"); log.info("Name : " + param.getName()); log.info("Nickname : " + param.getNickname()); log.info("============================ end =============================");
return ResponseEntity.ok().build(); }
|
name과 nickname을 JSON 형태의 요청으로 보내기 위해 해당 값들을 인자로 갖는 TestParam 클래스를 만들어 준다.
class TestParam implements Serializable { private String name; private String nickname;
public TestParam(String name, String nickname){ this.name = name; this.nickname = nickname; } }
|
객체를 String으로 변환하기
- ObjectMapper 를 이용해 TestParam 객체를 String 으로 변환한다.
- 만들어진 String 값을 이용해 Entity 객체를 생성한 후 Request(요청) 객체 Entity 에 넣어준다.
TestParam param = new TestParam("test", "Victor"); ObjectMapper objectMapper = new ObjectMapper();
StringEntity stringEntity = new StringEntity(objectMapper.writeValueAsString(param));
httpPost.setEntity(stringEntity);
|
ContentType 변경하기
JSON 형태의 요청을 보내기 위해서는 요청 Header 내 Content-type 을 application/json 로 설정해서 보내준다.
httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); CloseableHttpResponse response = httpClient.execute(httpPost);
|
전체 소스 코드
public class JavaHttpClientJson {
public static void main(String[] args) throws IOException { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("http://localhost:8080/test/json");
TestParam param = new TestParam("test", "Victor"); ObjectMapper objectMapper = new ObjectMapper();
StringEntity stringEntity = new StringEntity(objectMapper.writeValueAsString(param)); httpPost.setEntity(stringEntity); httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); CloseableHttpResponse response = httpClient.execute(httpPost);
System.out.println("=========================== start ============================");
System.out.println(objectMapper.writeValueAsString(param)); System.out.println("Http Status Code : " + response.getStatusLine().getStatusCode());
System.out.println("============================ end ============================="); } }
class TestParam implements Serializable { private String name; private String nickname;
public TestParam(String name, String nickname){ this.name = name; this.nickname = nickname; }
public String getName(){ return name; }
public String getNickname(){ return nickname; } }
|