如何在java

时间:2015-09-25 12:30:15

标签: java json http post

我想发送一个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 )

2 个答案:

答案 0 :(得分:3)

以下是您需要做的事情:

  1. 获取Apache HttpClient,这将使您能够提出所需的请求
  2. 使用它创建一个HttpPost请求并添加标题“application / x-www-form-urlencoded”
  3. 创建一个将JSON传递给它的StringEntity
  4. 执行电话
  5. 代码大致看起来像(你仍然需要调试它并让它工作)

    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
    }
    

答案 1 :(得分:2)

我更喜欢在HttpClient上继续使用HttpURLConnection。有关优势的一些评论可以在this SE question

找到

output.write(json.toString());

应改为

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

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