zoukankan      html  css  js  c++  java
  • 精讲RestTemplate第4篇-POST请求方法使用详解

    本文是精讲RestTemplate第4篇,前篇的blog访问地址如下:

    如果您阅读完本文章,觉得对您有帮助,请帮忙点个赞,您的支持是我不竭的创作动力

    在上一节为大家介绍了RestTemplate的GET请求的两个方法:getForObject()和getForEntity()。其实POST请求方法和GET请求方法上大同小异,RestTemplate的POST请求也包含两个主要方法:

    • postForObject()
    • postForEntity()

    二者的主要区别在于,postForObject()返回值是HTTP协议的响应体。postForEntity()返回的是ResponseEntity,ResponseEntity是对HTTP响应的封装,除了包含响应体,还包含HTTP状态码、contentType、contentLength、Header等信息。

    一、postForObject发送JSON格式请求

    写一个单元测试用例,测试用例的内容是向指定的URL提交一个Post(帖子).

    @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);
       }
    }
    
    • jsonplaceholder.typicode.com是一个可以提供在线免费RESTful测试服务的一个网站
    • ”/posts"服务接收PostDTO 参数对象,并将请求结果以JSON字符串的形式进行响应。响应结果就是请求参数对象对应的JSON字符串。
    • 所以postForObject方法第二个参数是请求数据对象,第三个参数是返回值类型

    最终将返回值的打印结果如下:

    二、postForObject模拟表单数据提交

    下面给大家写一个使用postForObject模拟表单数据提交的例子,即:提交x-www-form-urlencoded格式的数据

    @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支持占位符语法

    如果url地址上面需要传递一些动态参数,可以使用占位符的方式:

    String url = "http://jsonplaceholder.typicode.com/{1}/{2}";
    String url = "http://jsonplaceholder.typicode.com/{type}/{id}";
    

    具体的用法和使用GET方法请求是一致的,所以请参考: 精讲RestTemplate第3篇-GET请求使用方法详解

    四、postForEntity()方法

    上面的所有的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() 方法的使用

    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,可以通过如下的连接去获取数据。

    欢迎关注我的博客,里面有很多精品合集

    • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

    觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

  • 相关阅读:
    leetcode 347. Top K Frequent Elements
    581. Shortest Unsorted Continuous Subarray
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 217. Contains Duplicate、219. Contains Duplicate II、220. Contains Duplicate、287. Find the Duplicate Number 、442. Find All Duplicates in an Array 、448. Find All Numbers Disappeared in an Array
    leetcode 461. Hamming Distance
    leetcode 19. Remove Nth Node From End of List
    leetcode 100. Same Tree、101. Symmetric Tree
    leetcode 171. Excel Sheet Column Number
    leetcode 242. Valid Anagram
    leetcode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/zimug/p/13461609.html
Copyright © 2011-2022 走看看