如何在java中的http post中发送json对象

我想发送一个JSON对象(注意它不应该转换为字符串,因为服务器端代码基于Spring启动项目并且有params(@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,这将使您能够提出所需的请求
  2. 用它创建一个HttpPost请求并添加标题“application / x-www-form-urlencoded”
  3. 创建一个StringEntity,您将JSON传递给它
  4. 执行通话

代码大致看起来像(你仍然需要调试它并让它工作)

 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 } 

我更喜欢在HttpClient上继续使用HttpURLConnection。 关于优势的一些评论可以在这个SE问题中找到

output.write(json.toString());

应该改为

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

在写入对象之后不要忘记调用flush(),并且在写入操作之前应该指示UTF-8格式。