org.springframework.web.client.RestTemplate世上最全说明

书欣 Spring 发布时间:2023-01-02 16:58:05 阅读数:6987 1
下文笔者讲述RestTemplate世上最全讲解,如下所示

RestTemplate简介

RestTemplate是Spring框架中提供的用于发送HTTP请求的客户端工具
它遵循Restful原则
RestTemplate默认依赖JDK的Http连接工具HttpUrlConnection
   也可替换不同的源
    如:
	 OkHttp、Apache HttpComponents等 

RestTemplate数据转换

RestTemplate默认使用
   转化HttpMessageConverter去将Http消息
    转换成POJO或POJO转化成Http消息
   在创建RestTemplate的时候会默认添加一组HttpMessageConveter的实现

HttpMessageConveter源码

public interface HttpMessageConverter<T> {
	//指示此转换器是否可以读取给定的类。
	boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
	//指示此转换器是否可以写给定的类。
	boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
	//返回list<MediaType>
	List<MediaType> getSupportedMediaTypes();
	//读取一个inputMessage
	T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
		throws IOException, HttpMessageNotReadableException;
	//往output message写一个Object
	void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
		throws IOException, HttpMessageNotWritableException;
} 

RestTemplate中添加HttpMessageConverter的方法

 static {
        ClassLoader classLoader = RestTemplate.class.getClassLoader();
        romePresent = ClassUtils.isPresent("com.rometools.rome.feed.WireFeed", classLoader);
        jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", classLoader);
        jackson2Present =
                ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&
                        ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
        jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);
        jackson2SmilePresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.smile.SmileFactory", classLoader);
        jackson2CborPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.cbor.CBORFactory", classLoader);
        gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", classLoader);
        jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);
    }

	public RestTemplate() {
        this.messageConverters.add(new ByteArrayHttpMessageConverter());
        this.messageConverters.add(new StringHttpMessageConverter());
        this.messageConverters.add(new ResourceHttpMessageConverter(false));
        try {
            this.messageConverters.add(new SourceHttpMessageConverter<>());
        }
        catch (Error err) {
            // Ignore when no TransformerFactory implementation is available
        }
        this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
        if (romePresent) {
            this.messageConverters.add(new AtomFeedHttpMessageConverter());
            this.messageConverters.add(new RssChannelHttpMessageConverter());
        }
        if (jackson2XmlPresent) {
            this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
        }
        else if (jaxb2Present) {
            this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
        }
        if (jackson2Present) {
            this.messageConverters.add(new MappingJackson2HttpMessageConverter());
        }
        else if (gsonPresent) {
            this.messageConverters.add(new GsonHttpMessageConverter());
        }
        else if (jsonbPresent) {
            this.messageConverters.add(new JsonbHttpMessageConverter());
        }
        if (jackson2SmilePresent) {
            this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter());
        }
        if (jackson2CborPresent) {
            this.messageConverters.add(new MappingJackson2CborHttpMessageConverter());
        }
        this.uriTemplateHandler = initUriTemplateHandler();
    }

GET请求

getForEntity函数
    返回对象是ResponseEntity
  ResponseEntity是对响应体的封装
    包含响应状态码HttpStatus,响应头及相应体。
	响应体可以是自定义对象
	例 当User对象,则可以写成这样ResponseEntity
 getForEntity重载的函数有3个,使用及说明分别如下:

getForEntity(URI url, Class responseType)
    第一个参数是请求的URI
	 第二个参数是响应体的类型
UriComponents uriComponents = UriComponentsBuilder
		.fromUriString("http://localhost:8080/user/getByName?name={name}")
         .build()
         .expand("java265")	// 设置参数值
         .encode();
URI uri = uriComponents.toUri();
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User> responseEntity = restTemplate.getForEntity(uri, User.class);
User user = responseEntity.getBody();	// 获取body体

getForEntity(String url, Class responseType, Map<String, ?> uriVariables),
  第一个参数是请求的地址
  第二个参数是响应体的返回类型
  第三个参数提供url中的参数绑定,进行参数绑定时需要在占位符中指定Map中的key
   
   例 url为htttp://localhost:8080/user/getByName?name={name},则需要在Map中put一个key为name的值

String url = "http://localhost:8080/user/getByName?name={name}";
Map<String, String> params = new HashMap();
params.put("name", "java265");

RestTemplate restTemplate = new RestTemplate();

ResponseEntity<User> responseEntity = restTemplate.getForEntity(url, User.class, params);

User user = responseEntity.getBody();
 
 getForEntity(String url, Class responseType, Object… uriVariables)
 第一个参数是请求的url,第二个参数是响应体的返回类型,第三个参数提供url中的参数绑定,
 绑定根据占位符的数字获取uriVariables数组中相应位置的值
 例 url为htttp://localhost:8080/user/getByCond?name={1}&age={2},
        则name的值为uriVariables数组中第一个值,age为uriVariables数组中第二个值。

String url = "http://localhost:8080/user/getByCond?name={1}&age={2}";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User> responseEntity = restTemplate.getForEntity(url, User.class, "java265", 88);
User user = responseEntity.getBody();

getForObject

getForObject:
    返回对象是响应体的内容
    当不关心响应码、响应头信息可以使用此方法
 
 同样提供了3个重载的方法。
   getForObject(URI url, Class responseType)
      参数同getForEntity(URI url, Class responseType)
   getForObject(String url, Class responseType, Map<String, ?> uriVariables)
      参数同getForEntity(String url, Class responseType, Map<String, ?> uriVariables)
   getForObject(String url, Class responseType, Object… uriVariables)
      参数同getForEntity(String url, Class responseType, Object… uriVariables)

POST请求

第一种方式
   postForEntity返回对象是ResponseEntity是对请求响应的封装
   包含响应码HttpStatus、响应头及响应体信息,提供了3个重载的方法
   与get请求对应的方法不同的地方是多了一个入参,用来传递请求头、请求体参数

postForEntity(URI url, @Nullable Object request, Class responseType)
   第一个参数是请求的URI资源,URI的构造具体可参考jdk的API,
   第二个参数可以是一个普通对象,也可以是一个HttpEntity对象
    当是一个普通对象RestTemplate会将请求对象装换为一个HttpEntity对象来处理
	 其中Object是request的类型,request内容会被视作完整的body来处理
	 而如果request是一个HttpEntity对象,则会被当作一个完整的HTTP请求对象来处理
	 这个request中不仅包含了body的内容还包含了header中的内容
    第三个参数是响应体的返回类型

postForEntity(String url, @Nullable Object request, Class responseType, Map<String, ?> uriVariables)
    第一个参数是请求的url
	第二个参数封装请求体请求头信息
	第三个参数是响应体的返回类型
	第四个参数提供url中的参数绑定
	    url中的占位符即为Map中的key。

postForEntity(String url, @Nullable Object request, Class responseType, Object… uriVariables)
    第一个参数为请求的url
	第二个参数封装请求体请求头信息
	第三个参数为响应体的类型
	第四个参数是一个不定参数,用于url中参数绑定
	 占位符的值即为数组的顺序位置的值。

第二种方式
   postForObject返回值为响应体的类型
     提供了3个重载的方法
     参数的作用同postForEntity。
postForObject(URI url, @Nullable Object request, Class responseType)
postForObject(String url, @Nullable Object request, Class respon seType,Map<String, ?> uriVariables)
postForObject(String url, @Nullable Object request, Class responseType,
Object… uriVariables)

第三种方式:postForLocation此种方式较少使用
     该方式实现了以post请求提交资源,并返回新资源的URI
	  由于确定了方法的返回类型,此次较postForEntity和postForObject少一个参数
	  同样提供了3个重载的方法,参数作用同postForEntity

postForLocation(URI url, @Nullable Object request)
postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables)
postForLocation(String url, @Nullable Object request, Object… uriVariables)

PUT请求

put请求无返回值,提供了3个重载的方法。

put(URI url, @Nullable Object request)
   第一个参数是请求的URI资源
   第二个参数同样是请求体请求头的封装,可以是一般对象,也可以是HttpEntity对象

put(String url, @Nullable Object request, Map<String, ?> uriVariables)
   第一个参数是请求的url
   第二个参数是请求体请求头的封装
   第三个参数提供url参数的绑定,url中占位符即为Map中的key

put(String url, @Nullable Object request, Object… uriVariables)
   第一个参数请求的url
   第二个参数封装请求体请求头信息
   第三个不定参数用于url参数绑定

DELETE请求

delete请求无返回值,提供了3个重载的方法。

delete(URI url)参数URI为请求的URI资源
delete(String url, Map<String, ?> uriVariables)
    第一个参数是请求的url
	第二个参数用于url参数的绑定
delete(String url, Object… uriVariables)
    第一个参数是请求的url
	第二个参数用于url参数的绑定
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/Spring/202301/5253.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者