• Spring RestTemplate简介及使用


    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());
        }
    
  • 相关阅读:
    C++基础学习1-编译与链接
    html学习
    使用BP拦截POST请求包
    2019.9.17
    搭建LAMP环境
    2019.9.16
    2019.9.12
    2019.9.11
    手脱无名壳tslgame_rl
    一款自制壳的脱壳
  • 原文地址:https://www.cnblogs.com/quartz/p/12714240.html
Copyright © 2020-2023  润新知