当前位置: 首页 > 知识库问答 >
问题:

为什么RestTemplate GET响应在JSON中,而应该在XML中?

慕容星晖
2023-03-14
String apiResponse = getRestTemplate().postForObject(url, body, String.class);
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之后,我尝试了许多选项

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);
                }
            }
        }

你能给个主意吗?

共有1个答案

汝昀
2023-03-14

我可以在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();
 类似资料:
  • 问题内容: 我无法使用RestTemplate(org.springframework.web.client.RestTemplate)应对额外的弹簧行为,但没有成功。 我在代码下面的Hole应用程序中使用,并且始终会收到XML响应,该响应会解析并评估其结果。 但是无法确定为什么执行后服务器响应为JSON格式: 我已经在较低级别的RestTemplate上进行了调试,内容类型为XML,但是不知道为

  • 问题内容: 一次又一次,我看到Bash在Stack Overflow上使用了答案,而答案被猛烈抨击了,旨在使用这种“邪恶的”构造。为什么这么邪恶? 如果不能安全使用,我应该怎么用呢? 问题答案: 这个问题比眼前的问题还重要。我们将从显而易见的内容开始:具有执行“脏”数据的潜力。脏数据是指尚未重写为XYZ的任何数据;在我们的例子中,它是未格式化的任何字符串,以确保评估安全。 乍看之下,对数据进行消毒

  • 本文向大家介绍为什么在Bash中应该避免eval,我应该用什么来代替呢?,包括了为什么在Bash中应该避免eval,我应该用什么来代替呢?的使用技巧和注意事项,需要的朋友参考一下 eval是Bash shell的内置命令,它将其参数连接为单个字符串。然后,它将参数与空格连接起来,然后将该字符串作为bash命令执行。以下是其工作方式的示例。 eval示例 在下面的示例中,我们使用一个字符串,该字符串

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

  • 我正在尝试创建一个使用在我的数据库中创建新对象的REST API。我正在使用Slim框架。 问题是我不确定在我的< code>POST方法的这些行中到底应该放些什么: 我的完整路由是: 在表< code>cars中有对象< code>Car。 我应该这样说吗?: 我有点困惑,因为在我之前看到的教程中,在方法中,他们没有任何对路由中变量名称的引用。例如,如果他们使用,他们没有在其路由中声明任何名为的

  • 我无意中发现了一种非常普遍的做法。我甚至发现了一个网页,给它起了个名字,但我忘了名字,在谷歌上再也找不到那个网页了。 实践是,来自REST服务的每个JSON响应都应该具有以下结构: 或在错误情况下: 我的问题:JSON中为什么需要这样一个“status”属性?在我看来,这就是HTTP状态码的用途。 REST使用客户端和服务器之间的HTTP通信方式,例如,删除应该使用“DELETE”动词。同理,一个

  • 问题内容: 我有一个使用XML响应请求的服务器,我想在javascript中解析它。我真的很喜欢ActionScript XML解析器,它对我来说很容易使用。我在徘徊是否有一种非常简单/直接的方法来解析我从服务器获取的XML? 理想的用法应该是: fetchXML新的XMLParser。parser.parse访问文档。 顺便说一句,我计划使用jQuery。 问题答案: 一个普通的with 会解决

  • 将SAML响应返回给SP时,大多数IdP(如AzureAD、Okta、Onelogin、GSuite)都有以下签名选项: 签名响应 并且在没有任何配置的情况下,对于大多数IdP,签名的默认值是仅签署断言。 下面是来自AzureAD的SAML响应示例(默认签名选项是符号断言)。断言受到完整性保护,不能进行篡改。但是,断言以外的字段,,可以在不知情的情况下被篡改或添加/删除! 所以我的问题是: 为什么