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

Resttemplate获取带有自定义头的请求

丁景山
2023-03-14

我需要发送一个GET请求,标题是:Content-Type: Application/camiant-msr-v2.0 xml。我期待服务器的XML响应。我用邮递员测试了请求和响应,一切都很好。但是,当我尝试在Spring中使用RestTem板执行此操作时,我总是会收到400个错误请求。Spring的异常是:

Jul 09, 2016 12:53:38 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [/smp] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 400 Bad Request] with root cause
org.springframework.web.client.HttpClientErrorException: 400 Bad Request
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:475)

我的代码:

MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("Content-Type", "application/camiant-msr-v2.0+xml");

HttpEntity<?> entity = new HttpEntity<Object>(headers);
log.debug("request headers: " + entity.getHeaders());
ResponseEntity<String> response = restTemplate.exchange(queryUrl, HttpMethod.GET, entity, String.class);

调试消息将标头显示为{Content-Type=[Application/camiant-msr-v2.0 xml]},这似乎是正确的。我想知道我的请求出了什么问题,以及是否有一种方法可以看到在线调试的请求。

共有3个答案

程谦
2023-03-14

实际上,要传递的标头应该命名为Access而不是Content-Type,因为它是GET方法。但是服务器API文档以某种方式表示它期望Content-Type,并且来自命令行/Postman的API在Content-Type接受上都运行良好。我认为是Java库阻止将Content-Type标头传递给GET请求。

宗政卓
2023-03-14

400的可能解释是请求的内容类型不可接受或url不匹配。

从我个人的经验来看,我有一种强烈的感觉,你正在搞砸queryUrl,所以为了微调这里的东西,我建议你使用Spring的UriComponentsBuilder类。

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
        .queryParam("data", data);

HttpEntity<?> entity = new HttpEntity<>(headers);

HttpEntity<String> response = restTemplate.exchange(
        builder.build().encode().toUri(), 
        HttpMethod.GET, 
        entity, 
        String.class);

如果它仍然不起作用,请告诉我。

陈修诚
2023-03-14

以下几点对我很有用:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

@Service
public class Http {

    @Autowired
    private RestTemplate restTemplate;

    public String doGet(final String url) throws Exception {
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
        headers.add(HttpHeaders.USER_AGENT, "Mozilla/5.0");
        headers.add(HttpHeaders.ACCEPT_LANGUAGE, "en-US,en;q=0.8");
        HttpEntity<?> entity = new HttpEntity<Object>(headers);
        HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        return response.getBody();
    }

}
 类似资料:
  • 这是我的AngularJS代码(如果我删除header选项,它可以正常工作)。 请求如下: 答复: 我添加了和头,但请求仍然失败 大写字母(我的意思是vs)是否会导致失败?如果是,我如何才能让AngularJS停止这样做? Go服务器路由代码:

  • 如何将自定义标头添加到HttpClient请求?我使用方法发布JSON。我需要添加的自定义标题是 这是我到目前为止所做的:

  • 问题内容: 我想知道是否可以通过添加自定义信息来配置所有$ http请求标头。像config这样的东西: 但是对于所有$ http呼叫,我将使用不同的服务。我敢肯定有一个解决方案:D。谢谢 问题答案: 您可以创建一个拦截器来扩展标题:

  • 我试图用Spring Cloud Stream创建一个kafka使用者,以便监听在任何Spring上下文之外构建的kafka消息,并使用自定义头(operationType)。 我使用的是Spring Boot 1.5.x/Spring Cloud egdware.sr5和1.1.1版本的kafka-client和Kafka2.11。 我的侦听器类包含此方法 而operationType标头是存在

  • 我正在使用Alvaro的greach2014 repo来实验Spring Security Rest插件的行为。我可以登录到应用程序并生成身份验证令牌。然而,当我试图发送get请求时,我被重定向到登录页面。这是我的卷曲反应 我也用不记名旗试过,但结果是一样的 类似地,我也尝试过授权承载头,但它导致超时异常: Apache Tomcat/7.0.52-错误报告 键入异常报告 消息等待值的超时 注意根

  • 我知道https://swagger.io/docs/specification/authentication/bearer-authentication/,但它似乎并没有完全帮助我。 This(OpenAPI 3) 名为default的身份验证标头中的结果() 但这在Swagger编辑器中验证失败,因为我认为的不允许组件(就像类型一样)。老实说,我不能完全理解这里的医生。 我确实读过关于规范扩展