【Spring学习】RestTemplate访问Rest服务总结

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。调用RestTemplate的默认构造函数,RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。

ClientHttpRequestFactory接口主要提供了两种实现方式,一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接,还有一种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。

RestTemplate构造方法:

public RestTemplate(){
    //初始化过程
    messageConverters = new ArrayList();
    errorHandler = new DefaultResponseErrorHandler();
    headersExtractor = new HeadersExtractor();
    messageConverters.add(new ByteArrayHttpMessageConverter());
    messageConverters.add(new StringHttpMessageConverter());//StringHttpMessageConverter的默认编码是ISO-8859-1,可能会导致接收的返回报文出现乱码
    messageConverters.add(new ResourceHttpMessageConverter());
    messageConverters.add(new SourceHttpMessageConverter());
    messageConverters.add(new AllEncompassingFormHttpMessageConverter());
    if(romePresent)
    {
        messageConverters.add(new AtomFeedHttpMessageConverter());
        messageConverters.add(new RssChannelHttpMessageConverter());
    }
    if(jaxb2Present)
        messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
    if(jackson2Present)
        messageConverters.add(new MappingJackson2HttpMessageConverter());
    else
    if(jacksonPresent)
        messageConverters.add(new MappingJacksonHttpMessageConverter());
}

//实现超时
public RestTemplate(ClientHttpRequestFactory requestFactory){
    this();
    setRequestFactory(requestFactory);
}
第一个构造方法进行默认初始化,第二个构造方法可以传入ClientHttpRequestFactory参数,因为有时我们需要对请求时间进行设置,或者对超时进行处理,ClientHttpRequestFactory接口的实现类中有timeout属性,可以满足我们的需要。
HTTP POST请求:

public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)
        throws RestClientException
public <T> T postForObject(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables)
        throws RestClientException
public <T> T postForObject(URI url, Object request, Class<T> responseType) throws RestClientException
示例:

/**
 * 使用RestTemplate发送HTTP POST请求
 * @param url 请求地址
 * @param reqStr 请求参数
 * @param connectionTimeout 连接超时时间
 * @param socketTimeout socket超时时间
 * @return String 返回报文
 */
 public String postRest(String url, String reqStr,int connetionTimeOut, int socketTimeOut) {

    ResponseEntity<String> responseEntity0 = null;
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
    requestFactory.setConnectTimeout(connetionTimeOut);
    requestFactory.setReadTimeout(socketTimeOut);
    RestTemplate restTemplate = new RestTemplate(requestFactory);
    HttpHeaders headers = new HttpHeaders();
    headers.set("Content-Type", "text/plain;charset=UTF-8");//解决请求乱码问题
    headers.set("Accept", "text/plain;charset=UTF-8");
    headers.set("User-Agent","CLIENT(zk/1.2.1;android/1.0;640*480;MOT-XT800)");
    String body=null;
    try {
        responseEntity0 = restTemplate.postForEntity(url,new HttpEntity<String>(reqStr, headers), String.class);
        logger.debug("响应标头:responseEntity0.getHeaders="+ responseEntity0.getHeaders());
        body=new String(responseEntity0.getBody().getBytes("ISO-8859-1"), "utf-8");//解决返回报文的乱码问题
        logger.debug("响应字符串:responseEntity0.getBody()="+ responseEntity0.getBody());
    } catch (Exception e) {
        logger.error(" errpr happened in postRest(),", e);
    }
    return body;
}
HTTP GET请求:

//url:请求地址  responseType:返回值类型  urlVariables:请求中需要设置的参数
restTemplate.getForObject(String url,Class responseType,String… urlVariables);

//url:请求地址  responseType:返回值类型  inParams:请求中需要设置参数的Map集合
restTemplate.getForObject(String url,Class responseType,Map inParams);
注意:RestTemplate默认是使用org.springframework.http.converter.StringHttpMessageConverter来解析。StringHttpMessageConverter默认用ISO-8859-1来编码,所以再接收返回报文时可能会因此出现乱码的情况。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值