介绍
使用RestTemplate从服务消费端调用服务提供端的服务,简而言之是调用请求。
主要有以下几种调用方法:getForEntity、getForObject、postForEntity、postForObject、exchange、get、post、put、delete等方法。
GET
第一种:getForEntity
三种重载方法:
ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)
ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
ResponseEntity<T> getForEntity(URI url, Class<T> responseType)
返回值:
ResponseEntity<T>
,返回值包含statusCode、statusCodeValue、responseBody、headers(contentType、contentLength)等。
String body = response.getBody(); // 响应体
HttpStatus statusCode = response.getStatusCode(); // 状态码
int statusCodeValue = response.getStatusCodeValue(); // 状态码
HttpHeaders headers = response.getHeaders(); // 响应头
参数:
URL:请求地址;
responseType:响应体body类型;
uriVariables:参数变量;
代码:
类型一: 无参数
类型二: 参数传map
类型三: 参数用uri拼接方式
类型四: 返回值为自定义封装的实体类
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.HashMap;
import java.util.Map;
// 类型一: 无参数
public void get1(){
RestTemplate restTemplate = new RestTemplate();
String url = "http://ip/getUser";
ResponseEntity<String> response = restTemplate.getForEntity(url,String.class);
String body = response.getBody(); // 响应体
HttpStatus statusCode = response.getStatusCode(); // 状态码
int statusCodeValue = response.getStatusCodeValue(); // 状态码
HttpHeaders headers = response.getHeaders(); // 响应头
System.out.println(response.getBody());
}
// 类型二: 参数传map
public void get2{
Map<String, String> map = new HashMap<>();
map.put("name", "awen");
ResponseEntity<String> response= restTemplate.getForEntity("http://ip/getUser?name={name}", String.class, map);
System.out.println(response.getBody());
}
// 类型三: 参数用uri拼接方式
public void get3(){
RestTemplate restTemplate = new RestTemplate();
UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://ip/getUser?name={name}").build().expand("awen").encode();
URI uri = uriComponents.toUri();
ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class);
System.out.println(response.getBody());
}
// 类型四: 返回值为自定义封装的实体类
public void get4(){
ResponseEntity<User> response= restTemplate.getForEntity("http://ip/getUser", User.class);
System.out.println(response.getBody());
}
第二种:getForObject
对getForEntity的进一步封装,只返回消息体body,其他与getForEntity一样。
三种重载方法:
T getForObject(String url, Class<T> responseType, Object... uriVariables)
T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
T getForObject(URI url, Class<T> responseType)
代码略,参考getForEntity。
POST
第一种:postForEntity
三种重载方法:
ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)
ResponseEntity<T> postForEntity(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables)
ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType)
参数:
request:表示请求体内容;
代码:
类型一: 设置请求头,请求体类型为JSONObject
类型二: 设置请求体,响应体类型为自定义实体类User
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.JSONObject;
// 类型一: 设置请求头,请求体类型为JSONObject
public static void post1(){
RestTemplate restTemplate = new RestTemplate();
String url = "http://ip/insertUser";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
JSONObject body = new JSONObject();
body.put("name","awen");
body.put("password","123456");
HttpEntity<Object> request = new HttpEntity<>(body, headers);
ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
System.out.println(response.getBody());
}
// 类型二: 设置请求体,响应体类型为自定义实体类User
public static void post2(){
RestTemplate restTemplate = new RestTemplate();
String url = "http://ip/insertUser";
User user = new User();
user.setName("awen");
user.setPassword("123456");
ResponseEntity<User> response = restTemplate.postForEntity("http://ip/insertUser", user, User.class);
System.out.println(response.getBody());
}
// 类型三: uri方式参考getForEntity
第二种:postForObject
对postForEntity的进一步封装,只返回消息体body,其他与postForEntity一样。
三种重载方法:
T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)
T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables)
T postForObject(URI url, @Nullable Object request, Class<T> responseType)
代码略,参考postForEntity。
第三种:postForLocation
postForLocation方式与前面两种方式相比,该方式只返回URI。
三种重载方法:
URI postForLocation(String url, @Nullable Object request, Object... uriVariables)
URI postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables)
URI postForLocation(URI url, @Nullable Object request)
代码略,参考postForEntity。
PUT
可以使用put方法调用,重载的方法与前面的都一样,省略。
String url = "http://ip/putUser/id=1";
restTemplate.put(url,String.class);
DELETE
可以使用delete方法调用,重载的方法与前面的都一样,省略。
String url = "http://ip/deleteUser/id=1";
restTemplate.delete(url,String.class);
exchange
调用exchange方法,可以自定义发送请求方式,可以是HttpMethod.POST或者HttpMethod.GET等等。
public static void exchange(){
String url = "http://ip//getUser";
JSONObject body = new JSONObject();
body.put("name", "awen");
HttpHeaders httpHeaders = new HttpHeaders();
MediaType mediaType = MediaType.parseMediaType("application/json; charset=utf-8");
httpHeaders.setContentType(mediaType);
HttpEntity<String> entity = new HttpEntity<String>(body.toJSONString(),httpHeaders);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> exchange = restTemplate.exchange(url, HttpMethod.POST,entity,Object.class);
Object responseBody = exchange.getBody();
System.out.println(responseBody);
}