• 精讲响应式WebClient第3篇-POST、DELETE、PUT方法使用


    本文是精讲响应式WebClient第3篇,前篇的blog访问地址如下:

    一、RESTful风格与HTTP method

    熟悉RESTful风格的朋友,应该了解RESTful风格API使用HTTP method表达对资源的操作。

    常用HTTP方法 RESTful风格语义(操作)
    GET 查询、获取数据
    POST 新增、提交数据
    DELETE 删除数据
    PUT 更新、修改数据

    在上一篇文章中我们已经为大家介绍了如何使用WebClient作为Http客户端发送GET请求与进行响应结果的接收。本节来为大家介绍POST、DELETE、PUT。

    POST等其他的方法在与GET方法在使用如下方法的时候是一致的:

    • block()阻塞获取响应结果的方法,subscribe()非阻塞异步结果订阅方法
    • retrieve()获取HTTP响应体,exchange()除了获取HTTP响应体,还可以获取HTTP 状态码、headers、cookies等HTTP报文信息。
    • 使用Mono接收单个对象的响应结果,使用Flux接收集合类对象的响应结果。
    • 占位符语法传参方式

    所以想了解以上信息,请去参考: 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解。 本文只介绍POST、DELETE、PUT在使用过程中与GET不一样的地方。

    为了方便后续开发测试,首先介绍一个网站给大家。JSONPlaceholder是一个提供免费的在线REST API的网站,我们在开发时可以使用它提供的url地址测试下网络请求以及请求参数。或者当我们程序需要获取一些模拟数据、模拟图片时也可以使用它。

    二、Post请求发送JSON字符串、对象、表单数据

    2.1.使用Post方法向服务端发送JSON字符串数据

    public class OtherTest {
    
      //创建webClient
      private WebClient webClient = WebClient.builder()
              .baseUrl("http://jsonplaceholder.typicode.com")
              .build();
    
    
      @Test
      public void testPostJsonStr() {
        // 提交给服务端的JSON字符串
        String jsonStr = "{"userId": 1,"title": "zimugtest","body": "字母哥进行测试"}";
    
        // 发送请求
        Mono<String> mono = webClient
                .post() // POST 请求
                .uri("/posts")  // 请求路径
                .contentType(MediaType.APPLICATION_JSON)  //JSON数据类型
                .body(BodyInserters.fromValue(jsonStr))  //JSON字符串数据
                .retrieve() // 获取响应体
                .bodyToMono(String.class); //响应数据类型转换
    
        // 输出结果
        System.out.println(mono.block());
      }
    
    }
    
    

    响应结果打印如下,"http://jsonplaceholder.typicode.com/posts/1" 服务的请求数据就是响应数据。响应结果同样是一个JSON字符串:

    2.2.将对象以JSON数据形式发送服务端

      @Test
      public void testPostJson() {
        //构建请求发送对象
        PostDTO postDTO = new PostDTO();
        postDTO.setUserId(110);
        postDTO.setTitle("zimug-test");
        postDTO.setBody("字母哥进行Post测试");
    
        //发送请求
        Mono<PostDTO> mono = webClient
                .post() // 发送POST 请求
                .uri("/posts")  //服务请求路径,基于baseurl
                .contentType(MediaType.APPLICATION_JSON)  //以JSON数据格式
                .bodyValue(postDTO)   //发送请求体,对象形式
                .retrieve() // 获取响应体
                .bodyToMono(PostDTO.class); //响应数据类型转换
    
        // 输出结果
        System.out.println("=====" + mono.block());
      }
    

    响应结果打印如下,使用PostDTO接收响应结果。因为 "http://jsonplaceholder.typicode.com/posts/1" 服务的请求数据就是响应数据。打印结果是PostDTO对象的toString()方法

    2.3.POST模拟表单数据提交

      @Test
      public void testFormSubmit()  {
        //表单数据参数设置
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.add("title", "zimug-test");
        map.add("body", "字母哥进行测试");
    
        // 发送请求
        Mono<String> mono = webClient
                .post() // 发送POST 请求
                .uri("/posts")  // 请求路径
                .contentType(MediaType.APPLICATION_FORM_URLENCODED)  //表单数据类型
                .body(BodyInserters.fromFormData(map))  //表单数据
                .retrieve() // 获取响应体
                .bodyToMono(String.class); //响应数据类型转换
    
        // 输出结果
        System.out.println(mono.block());
      }
      
    }
    

    因为使用字符串的方式接受响应结果,所以输出和《2.1.使用Post方法向服务端发送JSON字符串数据》输出结果是一样的。

    三、使用 DELETE方法去删除资源

    删除一个已经存在的资源,使用webClient的delete()方法。该方法会向URL代表的资源发送一个HTTP DELETE方法请求。

    @Test
    public void testDelete()  {
      // 发送Delete请求
      webClient.delete().uri("/posts/1");  // 请求路径
    }
    

    在前面章节测试类的基础上,写如上代码的测试用例。上面代码含义为删除posts列表里面的第1个帖子。

    四、使用PUT方法去修改资源

    修改一个已经存在的资源,使用webClient的put()方法。该方法会向URL代表的资源发送一个HTTP PUT方法请求。

    @Test
    public void testPut()  {
      //要修改的数据对象
      PostDTO postDTO = new PostDTO();
      postDTO.setId(1);
      postDTO.setBody("字母哥进行Put测试");
    
      Mono<PostDTO> mono = webClient
              .put()
              .uri("/posts/1")  //服务请求路径,基于baseurl
              .contentType(MediaType.APPLICATION_JSON)
              .bodyValue(postDTO)   //发送请求体
              .retrieve() // 获取响应体
              .bodyToMono(PostDTO.class); //响应数据类型转换
    
      // 输出结果
      System.out.println("=====" + mono.block());
    }
    

    上面代码RESTful风格语义是:修改posts列表里面的第1个帖子。输出结果如下,是修改数据之后的结果:

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

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

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

  • 相关阅读:
    【mybatis源码学习】缓存机制
    【maven】命令
    【传输协议】thrift的IDL语法
    【传输协议】thrift原理
    Go 语言极速入门
    SOFABolt 源码分析
    !!!后续博客写到简书 + 博客园留博客目录
    第一章 java nio三大组件与使用姿势
    netty源码解析目录
    mac下host配置 + mac修改了环境变量却不生效:zsh: command not found: xxx
  • 原文地址:https://www.cnblogs.com/zimug/p/13544187.html
Copyright © 2020-2023  润新知