一般发送HTTP请求是使用 Apache的HttpClient,它比较灵活。在 spring cloud 中往往提供的 REST 风格的服务。RestTemplate 提供了一种简单便捷的模板类
来进行HTTP操作的方式。
或者,根据你的需要可考虑使用org.springframework.web.reactive.client.WebClient 具有更现代API并支持同步,异步和流传输方案。
HttpClient 是一个 模板化 的HTTP请求框架,比较适合用调用 REST请求。在 SpringCloud 微服务框架中应用较多。
超级简单,见下:
String url = "http://your_url";
ResponseEntity<String> result = restTemplate.getForEntity(url,String.class);
这样的方式要使用 map 传递参数。 如果有汉字要注意需要进行 urlencode。
String url = "http://127.0.0.1:8080/login?name={name}";
Map<String,String> map = new HashMap<>();
map.put("name","join");
ResponseEntity<String> result = restTemplate.getForEntity(url,String.class,map);
先 使用 UriComponents 构建一个对象,再 expand 替换参数实际的值,这样看起来比较清晰。
UriComponents uriComponents = UriComponentsBuilder
.fromUriString("http://example.com/hotels/{hotel}/bookings/{booking}").build();
URI uri = uriComponents.expand("42", "21").encode().toUri();
ResponseEntity<String> result = restTemplate.getForEntity(uri,String.class);
下面参数要传入一个 class , 这里直接传入 User.class 即可。
String url = "http://127.0.0.1:8080/login?name={name}";
Map<String,String> map = new HashMap<>();
map.put("name","zhang3");
ResponseEntity<User> result = restTemplate.getForEntity(url,User.class,map);
先构建一个 HttpEntity,构件时传入 header对象,再发送。
String url = "http://127.0.0.1:8080/xxx;
HttpHeaders resultRequestHeader = new HttpHeaders();
resultRequestHeader.add("charset", "UTF-8");
resultRequestHeader.setContentType(MediaType.APPLICATION_JSON);
LinkedMultiValueMap<String, Object> resultParamMap = new LinkedMultiValueMap<>();
HttpEntity<String> resultHttpEntity = new HttpEntity<>(null, resultRequestHeader);
ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET,resultHttpEntity,String.class);
和 get 方式类似,使用 postForEntity。
String url = "http://127.0.0.1:8080/login";
LinkedMultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
paramMap.add("username", "zhangsan");
paramMap.add("password", "123456");
paramMap.add("randomStr",String.valueOf(System.currentTimeMillis()));
HttpEntity<LinkedMultiValueMap<String, Object>> httpEntity = new HttpEntity<>(paramMap, requestHeaders);
ResponseEntity<String> exchange = restTemplate.postForEntity(url, httpEntity, String.class);
String resultRemote = exchange.getBody();//得到返回的值
执行给定中指定的请求,RequestEntity并以形式返回响应ResponseEntity。通常采用 builder 链式的方式构建一个 RequestEntity,例如: 方法签名:
public <T> ResponseEntity<T> exchange(RequestEntity<?> entity,
Class<T> responseType)
throws RestClientException
示例
MyRequest body = ...
RequestEntity request = RequestEntity
.post(new URI("https://example.com/foo"))
.accept(MediaType.APPLICATION_JSON)
.body(body);
ResponseEntity<MyResponse> response = template.exchange(request, MyResponse.class);
方法签名
public <T> ResponseEntity<T> exchange(RequestEntity<?> entity,
ParameterizedTypeReference<T> responseType)
throws RestClientException
见下示例:
MyRequest body = ...
RequestEntity request = RequestEntity
.post(new URI("https://example.com/foo"))
.accept(MediaType.APPLICATION_JSON)
.body(body);
ParameterizedTypeReference<List<MyResponse>> myBean =
new ParameterizedTypeReference<List<MyResponse>>() {};
ResponseEntity<List<MyResponse>> response = template.exchange(request, myBean);
对给定的URI模板执行HTTP方法,将给定的请求实体写入请求,并以形式返回响应ResponseEntity。给定ParameterizedTypeReference用于传递 泛型类型 的实体信息:
ParameterizedTypeReference 一般 用于传递 泛型集合 比如 List<MyBean> 这样的。
public <T> ResponseEntity<T> exchange(String url,
HttpMethod method,
@Nullable
HttpEntity<?> requestEntity,
ParameterizedTypeReference<T> responseType,
Object... uriVariables)
throws RestClientException
示例:
ParameterizedTypeReference<List<MyBean>> myBean =
new ParameterizedTypeReference<List<MyBean>>() {};
ResponseEntity<List<MyBean>> response =
template.exchange("https://example.com",HttpMethod.GET, null, myBean);
对 URI模板 发起 HTTP方法请求,使用 RequestCallback 做请求的处理和准备。并使用 ResponseExtractor 来处理 “响应结果 ”。
签名:
@Nullable
public <T> T execute(String url,
HttpMethod method,
@Nullable
RequestCallback requestCallback,
@Nullable
ResponseExtractor<T> responseExtractor,
Object... uriVariables)
throws RestClientException
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有