Spring RestTemplate 使用与HttpClient

1.引入

java请求网络资源通常用HttpClient等,Spring封装了库,提供更为简洁的资源请求方式RestTemplate

2.简单GET请求(HttpClient/RestTemplate)

HttpClient

 private static final CloseableHttpClient httpclient = HttpClients.createDefault();
 HttpGet httpget = new HttpGet(url);
 CloseableHttpResponse response = httpclient.execute(httpget);

 String result = null;
 HttpEntity entity = response.getEntity();
 if (entity != null) {
     result = EntityUtils.toString(entity);
 }
 System.out.println(result);

RestTemplate

//建议以注入方式使用
RestTemplate restTemplate=new RestTemplate();
String result = restTemplate.getForObject(url, String.class);
System.out.println(result);

对比下,明显RestTemplate方式更加优雅简洁;并提供方法将返回值映射为指定对象。

3.Spring注入方式使用

@Configuration  
public class RestClientConfig {  
  
    @Bean  
    public RestTemplate restTemplate() {  
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate;  
    }  
  
}  
@Service  
public class UserService {  
  
    @Autowired  
    private RestTemplate restTemplate;  
  
    // ...  
  
}  

4.RestTemplate的其他方法

这里写图片描述

  • getForObject: 发送get请求,结果封装为指定对象。 提供class指定
  • getForEntity: 发送get请求,结果为Entity类型。
  • postForObject: 发送post请求,结果封装为指定对象
  • put:
  • delete:
  • exchange:通用执行方法
exchange发送POST,APPLICATION_JSON示例
 HttpHeaders headers = new HttpHeaders();
 headers.setContentType(MediaType.APPLICATION_JSON);
 HttpEntity<String> entity = new HttpEntity<>(new Gson().toJson(requestData), headers);
 ResponseEntity<String> response = restTemplate
                .exchange(url, HttpMethod.POST, entity, String.class);

5.RestTemplate的请求301,302问题

描述:

使用过程发现,遇到301请求不能自动转发问题。

解决:

想起了使用HttpClient过程,实现请求自动转发需要创建HttpClient时设置重定向策略。
翻阅资料发现了这一段。

HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
HttpClient httpClient = HttpClientBuilder.create()
         .setRedirectStrategy(new LaxRedirectStrategy())
         .build();
 factory.setHttpClient(httpClient);
 restTemplate.setRequestFactory(factory);

于是问题解决。

分析:

查阅源码可见,
RestTemplate执行请求时。创建(createRequest)了一个HttpUriRequest来完成请求。createRequest具体在ClientHttpRequestFactory 实现,而上面代码中的HttpComponentsClientHttpRequestFactory,这个工厂在创建请求时正好用的apache下 httpClient的参数。由此可见。上面代码底层是以HttpClient方式发送的请求。

6.RestTemplate全部是以HttpClient方式请求的吗?

通过源码不难看到,默认RestTemplate使用的是SimpleClientHttpRequestFactory工厂。
追踪可见,默认它是以java.net下的HttpURLConnection方式发起的请求。
所以RestTemplate是支持多种方式发起请求的。
查看该工程的实现类可知,支持包括HttpClient, OkHttp等方式,如下图
这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值