当前位置: 首页 > 面试题库 >

为什么RestTemplate GET响应应为XML时为JSON?

房光临
2023-03-14
问题内容

我无法使用RestTemplate(org.springframework.web.client.RestTemplate)应对额外的弹簧行为,但没有成功。

我在代码下面的Hole应用程序中使用,并且始终会收到XML响应,该响应会解析并评估其结果。

String apiResponse = getRestTemplate().postForObject(url, body, String.class);

但是无法确定为什么执行后服务器响应为JSON格式:

String apiResponse = getRestTemplate().getForObject(url, String.class);

我已经在较低级别的RestTemplate上进行了调试,内容类型为XML,但是不知道为什么结果为JSON。

当我从浏览器访问时,响应也是XML格式,但是在apiResponse中,我得到了JSON。

在阅读Spring文档http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/client/RestTemplate.html之后,我尝试了很多选择

还尝试显式修改标题,但仍然无法弄清楚。

我调试了RestTemplate类,并注意到此方法始终在设置application / json:

public void doWithRequest(ClientHttpRequest request) throws IOException {
            if (responseType != null) {
                List<MediaType> allSupportedMediaTypes = new ArrayList<MediaType>();
                for (HttpMessageConverter<?> messageConverter : getMessageConverters()) {
                    if (messageConverter.canRead(responseType, null)) {
                        List<MediaType> supportedMediaTypes = messageConverter.getSupportedMediaTypes();
                        for (MediaType supportedMediaType : supportedMediaTypes) {
                            if (supportedMediaType.getCharSet() != null) {
                                supportedMediaType =
                                        new MediaType(supportedMediaType.getType(), supportedMediaType.getSubtype());
                            }
                            allSupportedMediaTypes.add(supportedMediaType);
                        }
                    }
                }
                if (!allSupportedMediaTypes.isEmpty()) {
                    MediaType.sortBySpecificity(allSupportedMediaTypes);
                    if (logger.isDebugEnabled()) {
                        logger.debug("Setting request Accept header to " + allSupportedMediaTypes);
                    }
                    request.getHeaders().setAccept(allSupportedMediaTypes);
                }
            }
        }

你能给个主意吗?


问题答案:

我可以在RC的帮助下解决我的问题。我将发布答案以帮助其他人。

问题在于,Accept标头会自动设置为APPLICATION / JSON,因此我必须更改调用服务的方式才能提供所需的Accept标头。

我改变了这个:

String response = getRestTemplate().getForObject(url, String.class);

为了使应用程序正常工作:

// Set XML content type explicitly to force response in XML (If not spring gets response in JSON)
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

ResponseEntity<String> response = getRestTemplate().exchange(url, HttpMethod.GET, entity, String.class);
String responseBody = response.getBody();


 类似资料:
  • 我的环境: Shop RestController:Spring Boot 在localhost laptopn ubuntu 18:04 在localhost desktop pc windows 10上 邮递员要求: Spring引导控制器: 我已经尝试使用Observable和any以及HttpHeaders和Application/JSON,但响应相同。

  • 我已经为我的自定义日志拦截器执行了以下操作 我正在将拦截器设置为restTemboard 记录器正在将响应正确地打印到控制台,但最后响应会以空的形式返回给调用者。我无法调试和解决它。 我已经弄明白了StreamUtils。copyToString(response.getBody(),字符集。defaultCharset())正在读取一次输入流,并且不再在其中保存响应正文(现在为空) 还有谁也面临

  • 问题内容: 为什么Google会优先使用其(私有)JSON响应? 例如,这是在Google日历中打开和关闭日历时的响应: 我认为这是为了防止人们对此进行操作,但是您真正要做的就是替换,然后进行设置。我认为评估是为了确保人们编写安全的JSON解析代码。 我也曾在其他几个地方使用过此功能,但在Google(邮件,日历,通讯录等)中使用了更多功能。奇怪的是,GoogleDocs以开头,而Google C

  • 使用TomCat为网站提供服务。通常,当我更新网站时,Chrome会对缓存感到困惑,并继续使用缓存中的旧页面,即使新的页面可用。这似乎是基于一个更基本的问题,Chrome也没有从服务器获得最新的响应头,这似乎阻止了任何控制缓存的能力。 我选择了一个javascript文件,做了一个小的修改来更改文件系统中文件的日期。然后我用Mozilla和Chrome重新蚀刻了页面。Mozilla似乎运行正常:服

  • 我正在学习fetch(),发现响应的主体使用了一种叫做readableStream的东西。根据我的研究,readable stream允许我们在从服务器下载数据后开始使用它(我希望我是正确的:)。就fetch()而言,可读流如何与fetch()配合使用,也就是说,我们无论如何都需要下载所有数据,然后开始使用它。总的来说,我无法理解fetch()中可读流的意义,因此我需要您的帮助:)。

  • 问题内容: 我是使用SOAP API的新手 我有一个来自API的肥皂响应 我正在尝试将其转换为对象。 通过在线阅读文章,我试图使用JAXB来做到这一点,但是我的对象是空的。 这是读取响应的代码。我将响应写到xml文件中以进行测试: 本类: 提前致谢! 问题答案: 您可以使用此代码检索POJO,还可以将@XmlRootElement作为标头添加到POJO。 (我没有测试下面的代码) 编辑: 我为您找