RestTemplate调用请求

介绍

使用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);
}

猜你喜欢

转载自blog.csdn.net/awen6666/article/details/104806422