如何在 Spring Boot 中使用带有 Bearer Token 和 form-data 的 Rest Template 调用 REST Api

Posted

技术标签:

【中文标题】如何在 Spring Boot 中使用带有 Bearer Token 和 form-data 的 Rest Template 调用 REST Api【英文标题】:How to call a REST Api using Rest Template with Bearer Token and form-data in Spring boot 【发布时间】:2020-06-22 23:18:52 【问题描述】:

我正在使用 Postman 调用 rest api,它使用以下请求给出了成功的响应(200 OK),

方法:POST

授权 => 类型:承载令牌 => 代币:saflsjdflj

身体 => 表单数据 => 键:公司ID, 值:123456

但是当我在 spring boot 中使用 rest 模板调用这个 api 时,它会给出 400 错误请求。代码如下,

HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + token);

HashMap<String, String> requestBody = new HashMap<>();
requestBody.put("companyId", "123456");

HttpEntity requestEntity = new HttpEntity<>(requestBody, headers)

ResponseEntity<CompanyResponse> response = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, CompanyResponse.class);

【问题讨论】:

【参考方案1】:

你必须配置restTemplate:添加FormHttpMessageConverter

RestTemplate restTemplate = new RestTemplateBuilder()
                .messageConverters(
                        new MappingJackson2HttpMessageConverter(objectMapper()),
                        new FormHttpMessageConverter())
                .build()

并且在发送请求时,您必须将MediaType.APPLICATION_FORM_URLENCODED 设置为contentType,并使用MultiValueMap 而不是HashMap 作为请求正文:

HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + token);
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();
requestBody.put("companyId", "123456");

HttpEntity requestEntity = new HttpEntity<>(requestBody, headers)

ResponseEntity<CompanyResponse> response = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, CompanyResponse.class);

【讨论】:

我认为现在响应类存在一些问题。你能展示一下吗(响应类)? 谢谢它的工作,我的响应 pojo 类没有正确构造。

以上是关于如何在 Spring Boot 中使用带有 Bearer Token 和 form-data 的 Rest Template 调用 REST Api的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?

如何在 Spring Boot 的 @RestController 注释用于创建请求处理程序的方法中使用带有参数的构造函数

如何在带有Github的Spring Boot上使用OIDC

如何在带有嵌入式 tomcat 的 Spring Boot App 中设置域名

如何在 Spring Boot 中使用带有 Bearer Token 和 form-data 的 Rest Template 调用 REST Api

带有 LocalDateTime 的 Spring Boot 项目