RestTemplate调用API的常用写法

摘要

本文介绍了RestTemplate调用http的几种写法,包括post+get,及传递参数的方式,让我们拿下它。

可选配置

依赖坐标pom.xml

xml 复制代码
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.14</version>
</dependency>

<!-- 统一使用依赖注入 private final RestTemplate restTemplate; -->

自定义配置

ini 复制代码
package org.coffeebeans.resttemplate;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;

/**
 * <li>ClassName: RestTemplateConfig </li>
 * <li>Author: OakWang </li>
 */
@Configuration
publicclassRestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setConnectTimeout(30000); // 连接超时时间(毫秒)
        factory.setReadTimeout(30000); // 读取超时时间(毫秒)
        RestTemplate restTemplate = new RestTemplate(factory);
        MappingJackson2HttpMessageConverterjsonConverter = new MappingJackson2HttpMessageConverter();
        restTemplate.getMessageConverters().add(jsonConverter);// 添加JSON消息转换器
        return restTemplate;
    }
}

实现get请求

  • GET+空参
ini 复制代码
String requestUrl = "https://jsonplaceholder.typicode.com/posts/1";
ResponseEntity<String> response = restTemplate.getForEntity(requestUrl, String.class);
if (Objects.equals(HttpStatus.OK, response.getStatusCode())) {
    log.info("请求响应结果: {}, {}", requestUrl, response.getBody());
    // 解析...
}
  • GET+单参
arduino 复制代码
String requestUrl = "https://jsonplaceholder.typicode.com/posts/{id}";
ResponseEntity<String> response = restTemplate.getForEntity(requestUrl, String.class, 1); // 参数值为 1
if (Objects.equals(HttpStatus.OK, response.getStatusCode())) {
    log.info("请求响应结果: {}, {}", requestUrl, response.getBody());
    // 解析...
}
  • GET+多参-方式1
dart 复制代码
String requestUrl = "https://jsonplaceholder.typicode.com/comments?id={id}&email={email}";
Map<String, Object> params = new HashMap<>();
params.put("id", 1);
params.put("email", "Eliseo@gardner.biz");
ResponseEntity<String> response = restTemplate.getForEntity(requestUrl, String.class, params);
if (Objects.equals(HttpStatus.OK, response.getStatusCode())) {
    log.info("请求响应结果: {}, {}", requestUrl, response.getBody());
    // 解析...
}
  • GET+多参-方式2
arduino 复制代码
String requestUrl = UriComponentsBuilder.fromHttpUrl("https://jsonplaceholder.typicode.com/posts/1/comments")
        .queryParam("id", "3")
        .queryParam("email", "Nikita@garfield.biz")
        .toUriString();
ResponseEntity<String> response = restTemplate.getForEntity(requestUrl, String.class);
if (Objects.equals(HttpStatus.OK, response.getStatusCode())) {
    log.info("请求响应结果: {}, {}", requestUrl, response.getBody());
    // 解析...
}

实现post请求

  • POST+空参
ini 复制代码
String requestUrl = "https://jsonplaceholder.typicode.com/posts";
ResponseEntity<Object> response = restTemplate.postForEntity(requestUrl, null, Object.class);
if (Objects.equals(HttpStatus.CREATED, response.getStatusCode())) {
    log.info("请求响应结果: {}, {}", requestUrl, response.getBody());
    // 解析...
}
  • POST+JSON 实体对象参数
ini 复制代码
String requestUrl="https://jsonplaceholder.typicode.com/posts";

List<MyEntity> entityList = new ArrayList<>(); //对象参数
entityList.add(MyEntity.builder().title("foo").body("bar").userId("1").build());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "");
HttpEntity<Object> requestEntity = new HttpEntity<>(entityList, headers);

ResponseEntity<Object> response = restTemplate.postForEntity(requestUrl, requestEntity, Object.class);
if (Objects.equals(HttpStatus.CREATED, response.getStatusCode())) {
    log.info("请求响应结果: {}, {}", requestUrl, response.getBody());
    // 解析...
}
  • POST+JSON 对象参数
ini 复制代码
String requestUrl="https://jsonplaceholder.typicode.com/posts";

Map<String, String> params = new HashMap<>();
params.put("title", "foo");
params.put("body", "bar");
params.put("userId", "1");
MultiValueMap<String, String> form = new LinkedMultiValueMap<>();
for (Map.Entry<String, String> entry : params.entrySet()) {
    form.add(entry.getKey(), entry.getValue());
}
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(form, headers);
ResponseEntity<Object> response = restTemplate.postForEntity(requestUrl, requestEntity, Object.class);
if (Objects.equals(HttpStatus.CREATED, response.getStatusCode())) {
    log.info("请求响应结果: {}, {}", requestUrl, response.getBody());
    // 解析...
}
  • POST+表单提交
dart 复制代码
String requestUrl="https://";
// 1. 初始化参数
Map<String, String> params = new HashMap<>();
params.put("title", "foo");
// 2. 构造 MultiValueMap
MultiValueMap<String, String> form = new LinkedMultiValueMap<>();
for (Map.Entry<String, String> entry : params.entrySet()) {
    form.add(entry.getKey(), entry.getValue());
}
// 3. 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
// 4. 发送请求 返回Object或者指定类型
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(form, headers);
ResponseEntity<Object> response = restTemplate.postForEntity(requestUrl, requestEntity, Object.class);
//5.处理结果
if (Objects.equals(HttpStatus.OK, response.getStatusCode())) {
    log.info("请求响应结果: {}, {}", requestUrl, response.getBody());
    // 解析...
}

总结

以上我们整理了RestTemplate调用接口的几种用法,包括post+get,空参、单参、多参的使用场景。

关注公众号:咖啡Beans

在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。

相关推荐
mldong1 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
157092511342 小时前
Android进阶之光:HTTP协议原理深度解析
android·网络协议·http
tqs_123452 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃2 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
weixin_BYSJ19873 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
Flynt3 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet3 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
星云API技术支持4 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin4 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
海宇AI5 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化