RestTemplate简绍
RestTemplate同步客户端执行 HTTP 请求,通过底层 HTTP 客户端库(例如 JDK HttpURLConnection、Apache HttpComponents 等)公开简单的模板方法 API。除了支持不常见情况的通用方法 exchange之外,RestTemplate 还通过 HTTP 方法提供常见场景的模板。execute
RestTemplate 通常用作共享组件。但是,其配置不支持并发修改,因此其配置通常在启动时准备。如果需要,您可以在启动时创建多个不同配置的 RestTemplate 实例。ClientHttpRequestFactory 如果需要共享 HTTP 客户端资源,这些实例可以使用相同的底层。
具体在使用Spring boot 中使用
可以自己在 创建个配置类 @Bean 注入 或者在 启动方法中 去进行Bean注入
@SpringBootApplication
public class CartApplication {
public static void main(String[] args) {
SpringApplication.run(CartApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
在使用时 通过 lombok 方法的 @RequiredArgsConstructor 或者自行使用 @Autowired 进行注入
lombok 需要导入jar 包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
将 @RequiredArgsConstructor写在 具体的类上
声明的变量必须加上final修饰
基于构造方法为属性赋值,容器通过调用类的构造方法将其进行依赖注入
如下示例
@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {
private final RestTemplate restTemplate;
}
使用 RestTemplate 具体方法
内部有很多 post, get, put,delete 方法 根据需要进行使用, 当前只表示通用的调用
exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference responseType, Map
- url: 网址信息
- HttpMethod: 可以选择 post, get, put, delete 状态
- HttpEntity:具体表头信息和主体信息可以通过这个补充,表示 HTTP 请求或响应实体,由标头和正文组成。经常与 结合使用RestTemplate,例如:
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.TEXT_PLAIN); HttpEntity<String> entity = new HttpEntity<>("Hello World", headers); URI location = template.postForLocation("https://example.com", entity); 或者 HttpEntity<String> entity = template.getForEntity("https://example.com", String.class); String body = entity.getBody(); MediaType contentType = entity.getHeaders().getContentType();
- ParameterizedTypeReference: 超类型标记模式会捕获类信息中的泛型参数,以避免Java语言中类型擦除的限制。此类的目的是允许捕获和传递泛型 Type。为了捕获泛型类型并在运行时保留它,您需要创建一个子类(最好是匿名内联类),如下所示:
typeRef然后可以使用生成的实例来获取Type 在运行时携带捕获的参数化类型信息的实例。有关“超类型标记”的更多信息,请参阅 Neal Gafter 的博客文章链接。ParameterizedTypeReference <List<String>> typeRef = new ParameterizedTypeReference <List<String>>() {};
Neal Gafter 谈超级类型标记
如下示例
HttpEntity<String> entity = new HttpEntity<>("Hello World", headers);
ResponseEntity<List<ItemDTO>> responseEntity = restTemplate.exchange(
"http://localhost:8081/items?ids={ids}",
HttpMethod.GET,
entity,
new ParameterizedTypeReference<List<ItemDTO>>() {
},
Map.of("ids", CollUtils.join(itemIds, ","))
);