Как я могу отправить объект json в сообщение http в java

Я хочу отправить объект JSON (обратите внимание, что он не должен быть преобразован в строку, поскольку код на стороне сервера основан на стартовом проекте Spring и имеет параметры как (@RequestBody PCAP pcap)). У меня есть код ниже но он преобразует тело в строку, которая дает мне 400 плохих запросов.

private void sendData(String ip){
    try{
        JSONObject json=new JSONObject();
        json.put("time_range", "22-23");
        json.put("flow_id", "786");
        json.put("ip_a", "192.65.78.22");
        json.put("port_a", "8080");
        json.put("regex", "%ab");



        URL url=new URL("http://"+ip+":8080/pcap");
        HttpURLConnection httpcon=(HttpURLConnection)url.openConnection();
        httpcon.setDoOutput(true);
        httpcon.setRequestMethod("POST");
        httpcon.setRequestProperty("Accept", "application/json");
        httpcon.setRequestProperty("Content-Type", "application/json");
        Cookie cookie=new Cookie("user", "abc");
        cookie.setValue("store");
        httpcon.setRequestProperty("Accept", "application/json");
        httpcon.setRequestProperty("Cookie", cookie.getValue());

        OutputStreamWriter output=new OutputStreamWriter(httpcon.getOutputStream());
        System.out.println(json);
        output.write(json.toString());
        httpcon.connect();
        String output1=httpcon.getResponseMessage();
        System.out.println(output1);

    }catch(Exception e){

    }

}

Примечание. Код на стороне сервера:

@RequestMapping(value = URIConstansts.PCAP, produces = { "application/json" }, method = RequestMethod.POST)
    public  ResponseEntity getPcap(HttpServletRequest request,@RequestBody PcapParameters pcap_params )

Ответ 1

Вот что вам нужно сделать:

  • Получить Apache HttpClient, это позволит вам сделать требуемый запрос
  • Создайте с ним запрос HttpPost и добавьте заголовок "application/x-www-form-urlencoded"
  • Создайте StringEntity, через который вы передадите JSON.
  • Выполните вызов

Код примерно выглядит (вам все равно нужно отладить его и заставить его работать)

HttpClient httpClient = new DefaultHttpClient(); //Deprecated
HttpClient httpClient = HttpClientBuilder.create().build(); //Use this instead 

try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/x-www-form-urlencoded");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);

    // handle response here...
}catch (Exception ex) {
    // handle exception here
} finally {
    httpClient.getConnectionManager().shutdown(); //Deprecated
}

Ответ 2

Я предпочитаю продолжить HttpURLConnection через HttpClient. Несколько комментариев о преимуществах можно найти на этом вопросе SE

output.write(json.toString());

следует изменить на

byte[] jsonBytes = json.getBytes("UTF-8");
output.write(jsonBytes);
output.flush();

Не забудьте вызвать flush() после записи объекта и Формат UTF-8 должен быть проинструктирован перед записью.