Извлечение JSON из ответа как ResponseEntityProxy {[Content-Type: application / json; charset = UTF-8, Chunked: true]} - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь загрузить файл по URL-адресу и получил вместо обычного JSON строкового ответа только ResponseEntityProxy{[Content-Type: application/json;charset=UTF-8,Chunked: true]}. Как я понял, там есть строка JSON в качестве ответа, и мне нужно как-то ее извлечь.
Вот мой код, который я пытался сделать до сих пор (это метод, в котором я загружаю файл в URL-адрес):

 public String uploadDocument() {
    
    String responseMsg="empty";
     
    try(CloseableHttpClient client = HttpClients.createDefault()){
    
        HttpPost httpPost = new HttpPost(SupportUtil.WHATSAPP_PUSH_BASEURL+"/media/upload/");
        httpPost.addHeader("Content-type", "application/octet-stream");
        httpPost.addHeader("Authorization", "Bearer " + SupportUtil.WHATSAPP_PUSH_KEY);
        
        File file=null;
        try {
            file = ResourceUtils.getFile("/home/ubuntu/DanFagin.pdf");
        } catch (FileNotFoundException e2) {
            
            e2.printStackTrace();
        }
        
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.addBinaryBody("file",file,ContentType.APPLICATION_OCTET_STREAM,"DanFagin.pdf");
        
        org.apache.http.HttpEntity multipart = builder.build();
        httpPost.setEntity(multipart);

        try (CloseableHttpResponse response = client.execute(httpPost)) {
            
            System.out.println(response.getEntity().toString());
            responseMsg= EntityUtils.toString(response.getEntity(),"UTF-8");
            System.out.println(responseMsg);
            
        } catch (ClientProtocolException e) {
            
            e.printStackTrace();
        } catch (IOException e) {
            
            e.printStackTrace();
        }
    
        System.out.println("Response is closed");
        System.out.println(responseMsg);
        
     } catch (IOException e1) {
        
        e1.printStackTrace();
    }
       
    System.out.println("Client is closed");
    return responseMsg;
    
}

Итак, здесь выше я построил объект HttpResponse (ранее в коде), а затем попытался использовать метод EntityUtils.toString(entity) для получения содержимого объекта. Но когда я использую этот метод, я получаю следующую ошибку:

org.apache.http.ConnectionClosedException: Premature end of chunk coded message body: closing chunk expected
    at org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:263)
    at org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:222)
    at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:183)
    at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:135)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.Reader.read(Reader.java:140)
    at org.apache.http.util.EntityUtils.toString(EntityUtils.java:227)
    at org.apache.http.util.EntityUtils.toString(EntityUtils.java:270)
    at org.apache.http.util.EntityUtils.toString(EntityUtils.java:290)
    at com.wingsure.WSWhatsapp.repository.RestTemplateImpl.uploadDocument(RestTemplateImpl.java:564)
    at com.wingsure.WSWhatsapp.service.RestTemplateService.uploadDocument(RestTemplateService.java:49)
    at com.wingsure.WSWhatsapp.repository.WebHookRepository.getWebHookDetails(WebHookRepository.java:60)
    at com.wingsure.WSWhatsapp.service.ProductService.getWebHookDetails(ProductService.java:84)
    at com.wingsure.WSWhatsapp.controller.ProductController.getWebHookDetails(ProductController.java:57)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
etc

Строка 564 - это место, где находится метод EntityUtils.toString(), и без него я не получаю никаких ошибок. С другой стороны, не нашел другого способа получить содержимое сущности, ie. строка JSON без использования метода EntityUtils.toString().
Может быть, кто-нибудь знает, в чем может быть проблема? Буду очень признателен за любую помощь и предложение .. В каждом случае спасибо.

1 Ответ

0 голосов
/ 03 августа 2020

Старайтесь не закрывать соединение

httpclient.close();
response.close();

Пусть фреймворк закрывает за вас. Я никогда не помню, чтобы закрыл это раньше. Просто мое предложение.

...