本文是精讲RestTemplate第4篇,前篇的blog访问地址以下:html
若是您阅读完本文章,以为对您有帮助,请帮忙点个赞,您的支持是我不竭的创做动力vue
在上一节为你们介绍了RestTemplate的GET请求的两个方法:getForObject()和getForEntity()。其实POST请求方法和GET请求方法上大同小异,RestTemplate的POST请求也包含两个主要方法:java
两者的主要区别在于,postForObject()返回值是HTTP协议的响应体。postForEntity()返回的是ResponseEntity,ResponseEntity是对HTTP响应的封装,除了包含响应体,还包含HTTP状态码、contentType、contentLength、Header等信息。spring
写一个单元测试用例,测试用例的内容是向指定的URL提交一个Post(帖子).json
@SpringBootTest class PostTests { @Resource private RestTemplate restTemplate; @Test void testSimple() { // 请求地址 String url = "http://jsonplaceholder.typicode.com/posts"; // 要发送的数据对象 PostDTO postDTO = new PostDTO(); postDTO.setUserId(110); postDTO.setTitle("zimug 发布文章"); postDTO.setBody("zimug 发布文章 测试内容"); // 发送post请求,并输出结果 PostDTO result = restTemplate.postForObject(url, postDTO, PostDTO.class); System.out.println(result); } }
最终将返回值的打印结果以下:后端
下面给你们写一个使用postForObject模拟表单数据提交的例子,即:提交x-www-form-urlencoded格式的数据springboot
@Test public void testForm() { // 请求地址 String url = "http://jsonplaceholder.typicode.com/posts"; // 请求头设置,x-www-form-urlencoded格式的数据 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //提交参数设置 MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("title", "zimug 发布文章第二篇"); map.add("body", "zimug 发布文章第二篇 测试内容"); // 组装请求体 HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); // 发送post请求,并打印结果,以String类型接收响应结果JSON字符串 String result = restTemplate.postForObject(url, request, String.class); System.out.println(result); }
请求数据打印结果以下:前后端分离
若是url地址上面须要传递一些动态参数,可使用占位符的方式:微服务
String url = "http://jsonplaceholder.typicode.com/{1}/{2}"; String url = "http://jsonplaceholder.typicode.com/{type}/{id}";
具体的用法和使用GET方法请求是一致的,因此请参考: 精讲RestTemplate第3篇-GET请求使用方法详解post
上面的全部的postForObject请求传参方法,postForEntity均可以使用,使用方法上也几乎是一致的,只是在返回结果接收的时候略有差异。使用ResponseEntity<T> responseEntity
来接收响应结果。用responseEntity.getBody()获取响应体。响应体内容同postForObject方法返回结果一致。剩下的这些响应信息就是postForEntity比postForObject多出来的内容。
HttpStatus statusCode = responseEntity.getStatusCode();
获取总体的响应状态信息 int statusCodeValue = responseEntity.getStatusCodeValue();
获取响应码值HttpHeaders headers = responseEntity.getHeaders();
获取响应头@Test public void testEntityPoJo() { // 请求地址 String url = "http://jsonplaceholder.typicode.com/posts"; // 要发送的数据对象 PostDTO postDTO = new PostDTO(); postDTO.setUserId(110); postDTO.setTitle("zimug 发布文章"); postDTO.setBody("zimug 发布文章 测试内容"); // 发送post请求,并输出结果 ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, postDTO, String.class); String body = responseEntity.getBody(); // 获取响应体 System.out.println("HTTP 响应body:" + postDTO.toString()); //如下是postForEntity比postForObject多出来的内容 HttpStatus statusCode = responseEntity.getStatusCode(); // 获取响应码 int statusCodeValue = responseEntity.getStatusCodeValue(); // 获取响应码值 HttpHeaders headers = responseEntity.getHeaders(); // 获取响应头 System.out.println("HTTP 响应状态:" + statusCode); System.out.println("HTTP 响应状态码:" + statusCodeValue); System.out.println("HTTP Headers信息:" + headers); }
输出打印结果
postForLocation的传参的类型、个数、用法基本都和postForObject()或postForEntity()一致。和前二者的惟一区别在于返回值是一个URI。该URI返回值体现的是:用于提交完成数据以后的页面跳转,或数据提交完成以后的下一步数据操做URI。
@Test public void testURI() { // 请求地址 String url = "http://jsonplaceholder.typicode.com/posts"; PostDTO postDTO = new PostDTO(); postDTO.setUserId(110); postDTO.setTitle("zimug 发布文章"); postDTO.setBody("zimug 发布文章 测试内容"); // 发送post请求,并输出结果 URI uri = restTemplate.postForLocation(url,postDTO); System.out.println(uri); }
输出结果以下,含义是:提交了post以后,该post的id是101,能够经过以下的链接去获取数据。
以为对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创做动力! 。另外,笔者最近一段时间输出了以下的精品内容,期待您的关注。