【问题标题】:RestTemplate postForObject response getting truncatedRestTemplate postForObject 响应被截断
【发布时间】:2016-09-23 16:28:14
【问题描述】:

尝试使用 Spring Web 客户端获取响应,但结果响应被截断,因为响应大小大于字符串类的大小。有没有其他方法可以在不被截断的情况下获得响应?

LinkedMultiValueMap<String, Object> requestMap = new LinkedMultiValueMap<String, Object>();
        //String response = "";
        try{
            File tempFile = File.createTempFile("ccda", "File");
            FileOutputStream out = new FileOutputStream(tempFile);
            IOUtils.copy(ccdaFile.getInputStream(), out);
            requestMap.add("ccdaFile", new FileSystemResource(tempFile));       
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);
            HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = 
                                        new HttpEntity<LinkedMultiValueMap<String, Object>>(requestMap, headers);
            RestTemplate restTemplate = new RestTemplate();
            FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
            formConverter.setCharset(Charset.forName("UTF8"));
            restTemplate.getMessageConverters().add(formConverter);
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

            String response = restTemplate.postForObject("localhost:8080", 
                                                requestEntity, String.class);

            tempFile.delete();
        }catch(Exception exc)
        {
            exc.printStackTrace();
        }

【问题讨论】:

    标签: string spring resttemplate


    【解决方案1】:

    你可以使用 InputStream 我想你可以这样做:

    InputStream is = rt.execute("localhost:8080", HttpMethod.POST, requestCallback, responseExtractor);
    

    其中 requestCallback 是 org.springframework.web.client.RequestCallback 的一个实现,就像这个

    public class MyRequestCallback implements RequestCallback
    {
        @Override
        public void doWithRequest(ClientHttpRequest request) throws IOException
        {
            request.getHeaders().add(HttpHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON_VALUE);
            request.getHeaders().add(HttpHeaders.ACCEPT, MimeTypeUtils.APPLICATION_JSON_VALUE);
        }
    }
    

    而 responseExtractor 可以通过此类的一个实例

    public class MyResponseExtractor implements ResponseExtractor<InputStream>
    {
        @Override
        public Boolean extractData(ClientHttpResponse response) throws IOException
        {
            HttpStatus status = response.getStatusCode();
            switch (status)
            {
            case OK:
                return response.getBody();
            default:
                return null;
            }   
        }
    }
    

    一旦获得 InputStream 你就可以管理它 希望有用

    【讨论】:

    • inputStream 不能用于 jsonMapping 并且为 inputStream 抛出 json 映射异常。
    • @Vishwaksena 你在使用 JSON 吗?所以我想你可以直接使用 Object 而不是粘贴字符串;我消耗了非常大的 JSON,从来没有遇到过这个问题
    • 我正在尝试使用返回的响应,它是一个 JSON,但是将其转换为字符串会被截断。
    • 在 DEBUG 级别(或更好的 TRACE)配置日志记录并重复调用,然后将日志消息放在这里..也许我们可以获得更多信息
    • 我实际上是在访问实时服务,因此保留了 localhost 而不是它,我无法获取服务器日志。
    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2010-09-17
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多