在开发中,经常发送http请求。我们可以使用jdk自带的HttpConnection,也可以是工具等等。这里我介绍http工具工具中的一种——RestTemplate,这个SpringBoot自带的http工具类。因为经常使用springboot,微服务中也是使用这个工具!不想再去弄一堆http工具!所以记下来。
一·、excute
excute是方法RestTemplate的基础调用,后面的方法调用,也都是基于此种方式。
此种方式最大的好处就是,直接读流,也许会觉得没什么用处。但是当请求是类似于返回一张二维码图片的时候,就会很好用!
// 创建rest模板对象
RestTemplate restTemplate = new RestTemplate();
String url = "http://www.baidu.com";
// 请求体定义
RequestCallback requestCallback = client ->{
client.getBody().write( "请求体".getBytes() );
client.getHeaders().add("请求头");
};
// 响应体的处理,提取
ResponseExtractor responseExtractor = response -> {
HttpStatus statusCode = response.getStatusCode();
String statusText = response.getStatusText();
System.out.println(statusCode.is2xxSuccessful());
System.out.println(statusText);
// 获取输入流,也就是响应的结果
InputStream body = response.getBody();
FileOutputStream fos = new FileOutputStream("./demo.txt");
byte[] temp = new byte[1024];
int tempInt = -1;
while ((tempInt = body.read(temp,0,1024)) != -1){
fos.write(temp,0,tempInt);
}
return null;
};
restTemplate.execute(url, HttpMethod.GET,requestCallback,responseExtractor);
二、exchange
RestTemplate restTemplate = new RestTemplate();
String url = "http://www.baidu.com";
// 定义请求头,可以设置JSON还是表单
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
RequestEntity<Void> build = RequestEntity.post(new URI(url)).headers(httpHeaders).build();
// 发送http请求,这里String是返回值的类型,也可以是其他对应的POJO对象,如果不是对应的POJO的JSON字符串,会抛出异常。这里返回的是响应体,这个在第三节说。
ResponseEntity<String> exchange = restTemplate.exchange(build, String.class);
System.out.println(exchange.getBody());
三、*ForEntity、*ForObject
这里主要区分一下*ForEntity与*ForObject的区别,前者是返回Http实体,其中包含响应体及HTTP状态码等,而后者只返回响应体中的内容。
RestTemplate restTemplate = new RestTemplate();
String url = "http://www.baidu.com";
/**
* 添加到Header和请求体中,直接获取响应体中的数据,当接口为其他状态码的时候吗,会抛出404异常,所以还是用entity好,毕竟其他异常还是要自己处理。
*/
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
RequestEntity<Void> build = RequestEntity.post(new URI(url)).headers(httpHeaders).build();
String forEntity = restTemplate.postForObject(url,build, String.class);
System.out.println(forEntity);
其实我开始觉得写这个没什么必要,但是当我一直在找工具,发现每一种操作都不太习惯,我越来发现写一篇文章来记录下是多么重要!