2017-05-03 7 views
0

웹 서비스에 대한 POST 요청에 Apache HttpClient를 사용합니다. 내가HttpClient POST 요청은 본문없이 상태 200을 반환합니다 (그러나 반드시 있어야 함). 내용의 길이는 -1

httpResult = 200을 받고 있어요 그러나 시체가 없다. 나는 어떤 몸체가 인 것으로 알고있다. 내가 다른 POST 호출 메서드를 사용할 때 JSON 형식으로 몸체를 가져올 것이다.

이 방법에서는 응답 본문의 길이가 -1입니다.

response.getEntity(). getContentLength() = -1;

결과는 입니다. EntityUtils.toString (response.getEntity())은 빈 문자열입니다.

코드는 다음과 같습니다

CloseableHttpClient client = HttpClients.createDefault(); 
    HttpPost httpPost = new HttpPost(url); 

    JSONObject attributes = new JSONObject(); 
    JSONObject main = new JSONObject(); 

    attributes.put("201", "Frank"); 
    main.put("attributes", attributes); 
    main.put("primary", "2"); 

    String json = main.toString(); 

    StringEntity entity = new StringEntity(json); 
    httpPost.setEntity(entity); 
    httpPost.setHeader("Accept", "application/json"); 
    httpPost.setHeader("Content-type", "application/json"); 

    CloseableHttpResponse response = client.execute(httpPost); 
    httpResult = response.getStatusLine().getStatusCode(); 

    client.close(); 

    if (httpResult == HttpURLConnection.HTTP_OK) { 

     HttpEntity ent = response.getEntity(); 

     Long length = ent.getContentLength(); 

     System.out.println("Length: " + length);// length = -1 

    } 

는 사람이 어떻게 문제를 해결하기 위해 내 몇 가지 힌트를 줄 수 있을까?

정확한 응답 본문을 제공하는 코드를 추가하고 싶습니다. 이 경우에는 HttpURLConnection을 사용합니다.

 HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); 
     urlConnect.setConnectTimeout(10000); 

     urlConnect.setRequestProperty("Accept", "application/json"); 
     urlConnect.setRequestProperty("Content-Type", "application/json"); 
     urlConnect.setRequestMethod("POST"); 

     JSONObject attributes = new JSONObject(); 
     JSONObject main = new JSONObject(); 

     attributes.put("201", "Frank"); 
     main.put("primary", "2"); 
     main.put("attributes", attributes); 

     urlConnect.setDoOutput(true); 

     OutputStreamWriter wr = new OutputStreamWriter(urlConnect.getOutputStream()); 
     wr.write(main.toString()); 
     wr.flush(); 

     httpResult = urlConnect.getResponseCode(); 

     System.out.println("Http Result: " + httpResult); 

     if (httpResult == HttpURLConnection.HTTP_OK) { 

      InputStream response = urlConnect.getInputStream(); // correct not empty response body 

      ... 
     } 
+0

사용 추출 뭐죠'EntityUtils.toString (response.getEntity())'의 결과? –

+0

** EntityUtils.toString (response.getEntity()) **의 결과는 빈 문자열입니다. –

+0

자, 자. 응답으로 엔티티가 반환되지 않으므로 길이는 -1입니다. 다른 http 클라이언트를 사용할 때 응답을받을 수 있습니까? –

답변

1

응답 작업을 한 후, 즉 말에 client.close();를 이동하십시오.

그리고 HttpUrlConnection의 응답은 다음과

InputStream response = urlConnect.getInputStream(); 
BufferedReader br = new BufferedReader(new InputStreamReader(response)); 
StringBuilder sb = new StringBuilder(); 
String line; 
while ((line = br.readLine()) != null) { 
    sb.append(line+"\n"); 
} 
br.close(); 

JSONObject object = new JSONObject(sb.toString()); //Converted to JSON Object from JSON string - Assuming response is a valid JSON object.