Spring RestTemplate简介及使用

摘要:
使用java。网HttpURLConnection以执行请求RestTemplatetemplate=newRestTemplate();list=template.getMessageConverters();
Spring RestTemplate介绍

1、springRestTemplate 简介

spring 提供的同步请求Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

是Spring用于同步client端的核心类,简化了与http服务的通信,并满足RestFul原则,程序代码可以给它提供URL,并提取结果。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。当然你也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。

在RestTemplate 之前可以使用apache下开源的HttpClient,使用httpClient需要自己处理请求和返回值,需要自己封装httpClient连接池,使用完之后需要释放链接等。

spring官网对RestTemplate 介绍如下

RestTemplate: The original Spring REST client with a synchronous, template method API.

2、springRestTemplate 初始化及配置

实例化RestTemplate,并对RestTemplate做配置。在内部,RestTemplate默认使用SimpleClientHttpRequestFactory和DefaultResponseErrorHandler来分别处理HTTP的创建和错误,但也可以通过setRequestFactory和setErrorHandler来覆盖。

//默认构造方法,使用的是java.net.HttpURLConnection执行请求
RestTemplate template = new RestTemplate();
//如果需要处理字符串返回值需要更改字符编码
    List<HttpMessageConverter<?>> list = template.getMessageConverters();
    for (HttpMessageConverter<?> httpMessageConverter : list) {
        if(httpMessageConverter instanceof StringHttpMessageConverter) {
            ((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName(charset));
            break;
        }
    }
//统一使用增加header方式处理

//使用httpClient初始化
RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory());

//使用okhttp3初始化
RestTemplate template = new RestTemplate(new OkHttp3ClientHttpRequestFactory());

template.setRequestFactory(okHttp3ClientHttpRequestFactory())

//可以在ClientHttpRequestFactory中设置超时时间、读取超时时间
private  OkHttp3ClientHttpRequestFactory okHttp3ClientHttpRequestFactory() {
        OkHttp3ClientHttpRequestFactory okHttp3ClientHttpRequestFactory = new OkHttp3ClientHttpRequestFactory();
        okHttp3ClientHttpRequestFactory.setConnectTimeout(60000);
        okHttp3ClientHttpRequestFactory.setReadTimeout(30000);
            return okHttp3ClientHttpRequestFactory;
    }

3、get请求

3.1、getForObject()方法

public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables){}
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
public <T> T getForObject(URI url, Class<T> responseType)
 	/**
     * 无参数get请求,直接获取实体对象
     */
    @Test
    public void testRestTemplate(){
        String url ="http://localhost:8081/show/org/get/1";
        Org s= restTemplate.getForObject(url, Org.class);
        System.out.println(s.getOrgName());
        System.out.println(s.getOrgNo());
    }

     /**
     * 使用占位符,传递参数,在get后加{1},参数会自动替换占位符
     */
    @Test
    public void testRestTemplate2(){
        String url ="http://localhost:8081/show/org/get/{1}";
        Org s= restTemplate.getForObject(url, Org.class,"555");
        System.out.println(s.getOrgName());
        System.out.println(s.getOrgNo());
    }

 	/**
     * 使用map,传递参数,需要在URL后拼接服务端参数名及map中key的名称,
     * 如果key在map中没有则会报异常
     * java.lang.IllegalArgumentException: Map has no value for 'ids'
     */
    @Test
    public void testRestTemplate3(){
        String url ="http://localhost:8081/show/org/get2?id={id}&orgNo={orgNo}";
        Map<String,String> map = new HashMap();
        map.put("id","5555");
        map.put("orgNo","66666");
        Org s= restTemplate.getForObject(url, Org.class,map);
        System.out.println(s.getOrgName());
        System.out.println(s.getOrgNo());
    }

3.2、getForEntity()方法

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables){}
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables){}
public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType){}

getForEntity()方法返回的是ResponseEntity对象,如果要转换成pojo,还需要使用JSON的工具类,fastjson或Jack son,ResponseEntity对象方便处理原生的response信息;

 /**
     * 无参数get请求,返回ResponseEntity对象
     */
    @Test
    public void testRestTemplate4(){
        String url ="http://localhost:8081/show/org/get/1";
        ResponseEntity<Org> s= restTemplate.getForEntity(url, Org.class);
        System.out.println(s.getStatusCode()+":"+s.getStatusCodeValue());
        System.out.println(" body :"+s.getBody());
        Org org = s.getBody();
        System.out.println(org.getOrgNo());
    }

4、post请求

post请求也有postForObject()方法和postForEntity()方法

4.1、postForObject()方法

	public <T> postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables)
throws RestClientException {}

	public <T> postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables)
throws RestClientException {}

	public &lt;T&gt; T postForObject(URI url, @Nullable Object request, Class<T> responseType,  responseType) throws RestClientException {}

/**
     * 无参数post请求,返回Object对象,使用map传递参数
     */
    @Test
    public void testRestTemplate5(){
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
        map.add("id", "123");
        map.add("orgNo", "123");
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
        String url ="http://localhost:8081/show/org/post";
        Org s= restTemplate.postForObject(url, request, Org.class);

    }

4.2、postForEntity()方法

@Override
	public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,
			Class<T> responseType, Object... uriVariables) throws RestClientException {}

	@Override
	public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,
			Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {}

	@Override
	public <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType)
			throws RestClientException {}

4.3、exchange()方法

exchange()可以指定HttpMethod,请求体requestEntity,建议在开发中使用exchange方法

 /**
     *
     */
    @Test
    public void testRestTemplate6(){
        String url ="http://localhost:8081/show/org/get/1";
        ResponseEntity<Org> s= restTemplate.exchange(url, HttpMethod.GET,null, Org.class);
        System.out.println(s.getBody());
    }

免责声明:文章转载自《Spring RestTemplate简介及使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HDU1402 FFT高精度乘法模板题C# JSON使用的常用技巧(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

树状数组求逆序对 附HDU1394

清楚的图解,解释树状数组求逆序对的方法,转载:https://blog.csdn.net/ssimple_y/article/details/53744096 题目:https://vjudge.net/problem/HDU-1394 思路:因为数字[1,n],把a[i]放到末尾,逆序对数量会增加n-a[i]个,即比它大的数字个数, 减少a[i]-1个,...

winform程序中界面的跳转问题

 首先是我们进行窗口间的跳转,尤其注意的是winform程序里面的空间都是中线程安全的。但是注意的是如果你在一个线程中操纵另外的控件,这时候会提示你一个错误,这个错误的解决方法准备单独的在另一篇文章中来讲。    好了,这时候回到主题上吧,怎么来实现界面间的跳转吧!假设我们想要从Form1跳转到Form2,那么可以有以下的集中方法:   1. 使用for...

vb添加GIF动态图片

        众说周知,GIF格式动画文件具有小巧、制作方便等特点,因此在网上得到广泛应用,在vb的picturebox和image控件添加图片后变成静止的了,这给我们设计VB应用程序带来了不便。原来以为实现起来特别的麻烦,又要注册控件,还得添加部件。通过学习方法特别很多,而且并没有多麻烦: 一、最简单的方法 1、在picturebox控件中添加gif格式...

Java 泛型(一)作用和使用

泛型的使用 : https://www.cnblogs.com/jpfss/p/9928747.html   在没有使用泛型的情况下,如果要实现参数“任意化”,通常会定义成Object类型来接受,然后强制类型转换使用;   而强制类型转换有明显的缺点,就是必须要知道实际参数的具体类型的情况才可以进行转换,同时在强制转换的过程中,编译器不会报错提示的,只有在...

C# SerialPort自定义串口DCB

C# SerialPort自定义串口DCBChange DCB fields from SerialPort instance CPS:中文DCB结构详解表 译自Change DCB fields from SerialPort instance C# C# SerialPort自定义串口DCB DCB(Device Control Block)在...

[转载]java中Statement详细用法

1、创建 Statement 对象建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句。Statement 对象用 Connection 的方法 createStatement 创建,如下列代码段中所示:Connection con = DriverManager.getConnection(url, "sunny", "");Statement...