HttpClient和RestTemplate
java请求网络资源通常用HttpClient等,Spring封装了库,提供更为简洁的资源请求方式RestTemplate
RestTemplate
默认使用的是SimpleClientHttpRequestFactory
工厂
默认它是以java.net下的HttpURLConnection
方式发起的请求
所以RestTemplate是支持多种方式发起请求的
查看该工程的实现类可知,支持包括HttpClient, OkHttp等方式
HttpClient:代码复杂,还得操心资源回收等,代码很复杂,冗余代码多,不建议直接使用,一般是封装为 HttpUtils工具类使用
RestTemplate: 是 Spring 提供的用于访问Rest服务的客户端, RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率
一、HttpClient
1、发起get无参请求
@Test //get 无参public void doGet() { String uri = "https://openapi.chanjet.com/auth/refreshToken?grantType=refresh_token&appKey=K2vIOn4m&refreshToken=1";// 1.创建Http客户端CloseableHttpClient httpClient = HttpClientBuilder.create().build();// 2.创建Get请求HttpGet request = new HttpGet(uri);// 3.响应模型CloseableHttpResponse response = null;try {// 3.执行Get请求response = httpClient.execute(request);// 4.从响应模型中获取响应实体HttpEntity responseEntity = response.getEntity();System.out.println("响应状态为:" + response.getStatusLine());if (responseEntity != null) {System.out.println("响应内容长度为:" + responseEntity.getContentLength());System.out.println("响应内容为:" + EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));}} catch (IOException e) {e.printStackTrace();} finally {try {if (httpClient != null) {httpClient.close();}if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}}}
2、发起post无参请求
@Test //post 对象public void postObject() { // 如果有普通参数,uri 改成 URIBuilderString uri = "http://localhost:8080/people/addPeople";// 创建Http客户端CloseableHttpClient httpClient = HttpClientBuilder.create().build(); // 创建Post请求HttpPost request = new HttpPost(uri);request.setHeader("Content-Type", "application/json;charset=utf8"); // 添加json对象People people = new People();people.setName("张飞");people.setCreateTime(LocalDateTime.now());String jsonString = JSON.toJSONString(people);StringEntity entity = new StringEntity(jsonString, "UTF-8");httpPost.setEntity(entity);// 响应模型CloseableHttpResponse response = null;try {// 执行Post请求response = httpClient.execute(request);// 从响应模型中获取响应实体HttpEntity responseEntity = response.getEntity();System.out.println("响应状态为:" + response.getStatusLine());if (responseEntity != null) {System.out.println("响应内容长度为:" + responseEntity.getContentLength());System.out.println("响应内容为:" + EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));}} catch (IOException e) {e.printStackTrace();} finally {try {if (httpClient != null) {httpClient.close();}if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}}}
二、RestTemplate
1、发起get请求请求
发送一个HTTP GET请求,返回的请求体将映射为一个对象
getForObject()
发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象
getForEntity()
RestTemplate restTemplate = new RestTemplate();ResponseEntity<String> entity = restTemplate.getForEntity(uri, String.class);// TODO 处理响应
2、发起Post请求方式
postForEntity()
POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的。
postForObject()
POST 数据到一个URL,返回根据响应体匹配形成的对象。
postForLocation()
POST 数据到一个URL,返回新创建资源的URL
RestTemplate restTemplate = new RestTemplate();// headersHttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON_UTF8);HttpEntity<Object> objectHttpEntity = new HttpEntity<>(headers);// TODO 处理响应ResponseEntity<String> entity = restTemplate.postForEntity(uri, request, String.class);
作者:廉小雨
来源链接:https://blog.csdn.net/weixin_40964170/article/details/118990860
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。