
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;     } }
  |