RestTemplate使用总结

RestTemplate的介绍就不说了,总的来说用这个对象可以很方便的模拟一个http请求。
Talk is cheap,Show me the code,

使用的是springboot整合的工程所以以下涉及到的对象都是注解式的声明和注入,
一、声明restTemplate对象

    @Bean
    public RestTemplate getRestTemplate() {
        RestTemplate restTemplate = new RestTemplate(
                getClientHttpRequestFactory());
        return restTemplate;
    }
    @Bean
    public ClientHttpRequestFactory getClientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(
                getHttpClient());
        factory.setConnectTimeout(3000);
        factory.setReadTimeout(5000);
        return factory;
    }
    @Bean
    public ClientHttpRequestFactory getClientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(
                getHttpClient());
        factory.setConnectTimeout(3000);
        factory.setReadTimeout(5000);
        return factory;
    }
    @Bean
    public HttpClient getHttpClient() {

        final ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {
            public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
                return 5 * 1000;//设置一个链接的最大存活时间
            }

        };
        return HttpClientBuilder.create().setConnectionManager(getManager())
                .setKeepAliveStrategy(myStrategy).build();
    }
当然,可以利用注解@Bean的name属性指定实例化对象的name,注入的时候使用@Qualifier("Name of restTemplate")指定name即可。
在平常使用中如果不想启动spring的ioc,并且想简单使用restTemplate 可以直接使用new,但是要注意使用中发出去一个请求之后有可能链接断了之后那么程序会永远的阻塞在那了,切记。
RestTemplate restTemplate = new RestTemplate();
在使用中要在适合的时机去清空超时或者空白的链接

            @Autowired
            private PoolingHttpClientConnectionManager manager;

            ...............
            connectionManager.closeExpiredConnections();
            connectionManager.closeIdleConnections(10, TimeUnit.SECONDS);

下面展示header的设置以及一个完整的交互过程

public String getPolicyJson(String policyNo){
        HttpHeaders httpHeaders = new HttpHeaders();
        //设置header
        httpHeaders.add("Content-Type", "application/json; charset=UTF-8"); 
        Map<String, String> hashmap = new LinkedHashMap<String, String>();
        int random = RandomUtils.nextInt(0, 100000);
        hashmap.put("random", random+"");
        hashmap.put("orderNo", policyNo);
        hashmap.put("requestSource","");
        HttpEntity<Map<String, String>> requestEntity = new HttpEntity<Map<String, String>>(
                hashmap, httpHeaders);
        ResponseEntity<String> resp = restTemplate.exchange(queryUrlJson
                ,HttpMethod.POST,requestEntity, String.class);
        //获取返回的header
        List<String> val = resp.getHeaders().get("Set-Cookie");
        String body = resp.getBody();
        return body;
    }
上面代码的hashmap一个字段只能传输一个值,可以使用org.springframework.util.LinkedMultiValueMap.LinkedMultiValueMap<String,String>()这个类的对象传输,一般情况下是与上述代码的结果一样的
restTemplate有许多get和post开头的方法,可以都试试啊说不定就遇到了个最喜欢的了,

附,
如果返回结果是html,可以使用Jsoup的Document 进行解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值