在日常开发过程中,http接口不仅提供给前端调用,有的时分还需求提供给其他事务方调用,在后台调用http恳求的时分,我们一般运用Http Client客户端调用,java常用的Http客户端有:

  • java原生的HttpURLConnection
  • Apache http client
  • OkHttp
  • RestTemplate

下面来详细介绍一下运用RestTemplate来调用Post和Get恳求。

在RestTemplate中,对同一种恳求办法,一般有两种调用办法:

  • xxForObject
    • 回来一个指定类型的目标,通常是呼应体反序列化后的java目标
    • 只回来反序列化的java目标,没有额外的http相应信息,只知道恳求是否成功。
  • xxForEntity
    • 回来的是一个ResponseEntity目标,其中包含完整的http呼应信息(状态码、呼应头、呼应体)

一、POST恳求调用

/**
    String/URI url: 恳求的URL途径
    request: 一般设置恳求头和恳求体
    responseType:恳求完结之后回来的结果类型
    Map<String, ?>/Object... uriVariables: 用来拼接恳求url,可所以Map<String, ?>类型或Object类型可变参数
**/
postForObject/postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables)
eg:
void fun() {
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_JSON);
    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    HttpEntity<String> httpEntity = new HttpEntity<>(params, headers);
    // 留意,如果想要运用可变参数来拼接url,那这儿的url一定要运用占位符{}替换,而且称号要和可变参数称号相同才干在运行时将占位符位置替换成传入动态参数【可变参数也可以不传,那么这儿的url就不需求占位符拼接】
    String url = "http://www.sea.com?uid={uid}&username={username}";
    String uid = "123";
    String username = "sea";
    // 由于responseType用的是String类型,所以回来的是一个String类型字符串
    String result = restTemplate.postForObject(url, httpEntity, String.class, uid, username);
}
postForObject/postForEntity(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables)
eg:
void fun() {
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_JSON);
    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    HttpEntity<String> httpEntity = new HttpEntity<>(params, headers);
    // 留意,如果想要运用可变参数来拼接url,那这儿的url一定要运用占位符{}替换,而且称号要和可变参数称号相同才干在运行时将占位符位置替换成传入动态参数
    String url = "http://www.sea.com?uid={uid}&username={username}";
    Map<String, Object> params = new HashMap<>();
    String uid = "123";
    String username = "sea";
    params.put("uid", uid);
    params.put("username", username)
    // 由于responseType用的是String类型,所以回来的是一个String类型字符串
    String result = restTemplate.postForObject(url, httpEntity, String.class, params);
}
postForObject/postForEntity(URI url, Object request, Class<T> responseType)
eg:
void fun() {
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_JSON);
    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    HttpEntity<String> httpEntity = new HttpEntity<>(params, headers);
    String url = "http://www.sea.com";
    MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
    multiValueMap.put("uid", 123);
    multiValueMap.put("username", "sea");
    // 不再运用可变参数绑定url,直接传入绑定后的uri参数
    URI uri = UriComponentsBuilder.fromHttpUrl(url).queryParams(multiValueMap).build().encode().toUri();
    // 由于responseType用的是String类型,所以回来的是一个String类型字符串
    String result = restTemplate.postForObject(uri, httpEntity, String.class);
}
eg: xxforEntity()
void fun() {
    Map<String, Object> map = new HashMap<>();
    map.put("uid", 123);
    map.put("username", "sea");
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<HashMap<String, Object>> httpEntity = new HttpEntity<>(map, headers);
    String url = "http://www.sea.com";
    // 运用xxforEntity,回来的是一个ResponseEntity,里面包含了statusCode(状态码)、Headers(呼应头)、body(呼应体)
    ResponseEntity<String> responseEntity = restTemplate.postForEntity(uri, httpEntity, String.class);
}

二、GET恳求调用

getForObject/getForEntity(String url, Class<T> responseType, Object... uriVariables)
getForObject/getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
getForObject/getForEntity(URI url, Class<T> responseType)
在get恳求调用中,除了恳求参数中少了Object request【恳求头和恳求体】,其他的参数和办法调用同上面post的办法调用是相同的

三、Exchange调用

exchange调用可以理解为是一个全能调用,不特定是post还是get类型调用,恳求办法由调用者指定。
ps:如果在get恳求中需求指定恳求头和恳求体,而getForXX又不支撑办法又不支撑设置恳求头,此时可以改成用exchange办法来调用,自己往HttpEntity<?> requestEntity参数中设置恳求头和体。