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

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

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

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

  • 相关阅读:
    Spring之Condition(二)在哪里解析的
    SpringBoot启动跟代码过程
    Spring之Condition(一)
    Kafka之 vm.max_map_count
    Redis常见面试题
    Redis为什么快
    TCP一个包多大
    场景问题
    这是一个测试
    小程序-使用django-drf开接口的步骤
  • 原文地址:https://www.cnblogs.com/zimug/p/13461609.html
Copyright © 2011-2022 走看看