2015-09-25 19 views
3

我想发送一个JSON对象(请注意,它不应该转换为字符串,因为服务器端代码基于Spring初学者项目并且具有参数(@RequestBody PCAP pcap))我有我的下面的代码,但它将身体转换为一个字符串,给我400个不好的请求。我该如何发送json对象在java中的http发布内容

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) 

回答

3

以下是你需要做的:

  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 
} 
+0

但你不觉得这会给我一个400错误,因为在服务器端(注意它的服务器端是基于spring mvc的其余代码)是(@RequestBody PCAP pcap)和im在身体中发送一个字符串 –

+4

哈哈。你从这里复制:http://stackoverflow.com/questions/7181534/http-post-using-json-in-java – tObi

2

我喜欢继续通过HttpClient进行HttpURLConnection。在优势的一些意见可以在this SE question

output.write(json.toString());

发现应改为

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

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

+0

看看在同一类型的问题在SE:http://stackoverflow.com/问题/ 21404252 /请求后发送-JSON-数据-java的HttpURLConnection的 –

+0

没有其不工作即时没有获得上服务器侧的要求,下面是服务器端代码 \t @RequestMapping(值= URIConstansts.PCAP,产生= {“application/json”},method = RequestMethod.POST) \t public ResponseEntity getPcap(HttpServletRequest请求,@ RequestBody PcapParameters pcap_params) –

+0

添加一行代码。 httpcon.getResponseCode()。让我们看看进一步分析的价值 –