zoukankan      html  css  js  c++  java
  • spring boot使用WebClient调用其他系统提供的HTTP服务

    WebClient的请求模式属于异步非阻塞,能够以少量固定的线程处理高并发的HTTP请求

    WebClient是Spring WebFlux模块提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具,从Spring5.0开始提供

    在Spring Boot应用中

    1.添加Spring WebFlux依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

    2.使用

    (1)Restful接口demoController.java

    package com.example.demo.controller;
    
    import com.example.demo.domain.MyData;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.*;
    
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    
    @RestController
    @RequestMapping("/api")
    public class demoController {
    
        @GetMapping(value = "/getHeader", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
        public MyData getHeader(HttpServletRequest request) {
    
            int id = 0;
            if (request.getParameter("id") != null) {
                id = Integer.valueOf(request.getParameter("id"));
            }
            String name = request.getParameter("name");
            //header
            String userAgent = "USER_AGENT——" + request.getHeader(HttpHeaders.USER_AGENT);
            userAgent += " | ACCEPT_CHARSET——" + request.getHeader(HttpHeaders.ACCEPT_CHARSET);
            userAgent += " | ACCEPT_ENCODING——" + request.getHeader(HttpHeaders.ACCEPT_ENCODING);
            userAgent += " | ContextPath——" + request.getContextPath();
            userAgent += " | AuthType——" + request.getAuthType();
            userAgent += " | PathInfo——" + request.getPathInfo();
            userAgent += " | Method——" + request.getMethod();
            userAgent += " | QueryString——" + request.getQueryString();
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    System.out.println(cookie.getName() + ":" + cookie.getValue());
                }
            }
            MyData data = new MyData();
            data.setId(id);
            data.setName(name);
            data.setOther(userAgent);
            return data;
        }
    
        @PostMapping(value = "/getPost", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
        public MyData getPost(HttpServletRequest request) {
    
            int id = 0;
            if (request.getParameter("id") != null) {
                id = Integer.valueOf(request.getParameter("id"));
            }
            String name = request.getParameter("name");
            System.out.println(name + "," + id);
            MyData data = new MyData();
            data.setId(id);
            data.setName(name);
            return data;
    
        }
    
        /**
         * POST传JSON请求
         */
        @PostMapping(value = "/getPostJson", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
        public MyData getPostJson(@RequestBody(required = true) MyData data) {
            System.out.println(data.getId());
            System.out.println(data.getName());
            return data;
        }
    }

    MyData.java

    package com.example.demo.domain;
    
    public class MyData {
        private int id;
        private String name;
        private String other;
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getOther() {
            return other;
        }
    
        public void setOther(String other) {
            this.other = other;
        }
    }

    (2)WebClient使用

    DemoApplicationTests.java

    package com.example.demo;
    
    import com.example.demo.domain.MyData;
    import org.junit.Test;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.MediaType;
    import org.springframework.util.LinkedMultiValueMap;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.reactive.function.BodyInserters;
    import org.springframework.web.reactive.function.client.WebClient;
    import reactor.core.publisher.Mono;
    
    import java.time.Duration;
    import java.time.temporal.ChronoUnit;
    
    public class DemoApplicationTests {
    
        private WebClient webClient = WebClient.builder()
                .baseUrl("http://127.0.0.1:8080")
                .defaultHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)")
                .defaultCookie("ACCESS_TOKEN", "test_token").build();
    
        @Test
        public void WebGetDemo() {
    
            try {
                Mono<MyData> resp = webClient.method(HttpMethod.GET).uri("api/getHeader?id={id}&name={name}", 123, "abc")
                        .retrieve()
                        .bodyToMono(MyData.class);
                MyData data = resp.block();
                System.out.println("WebGetDemo result----- " + data.getString());
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        @Test
        public void WebPostDemo() {
            MultiValueMap<String, String> formData = new LinkedMultiValueMap<>(2);
            formData.add("id", "456");
            formData.add("name", "xyz");
    
            Mono<MyData> response = webClient.method(HttpMethod.POST).uri("/api/getPost")
                    .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                    .body(BodyInserters.fromFormData(formData))
                    .retrieve()
                    .bodyToMono(MyData.class).timeout(Duration.of(10, ChronoUnit.SECONDS));
            System.out.println(response);
            MyData data = response.block();
            System.out.println("WebPostDemo result----- " + data.getString());
        }
    
        @Test
        public void WebPostJson() {
            MyData requestData = new MyData();
            requestData.setId(789);
            requestData.setName("lmn");
    
            Mono<MyData> response = webClient.post().uri("/api/getPostJson")
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .syncBody(requestData)
                    .retrieve()
                    .bodyToMono(MyData.class).timeout(Duration.of(10, ChronoUnit.SECONDS));
    
            MyData data = response.block();
            System.out.println("WebPostJson result----- " + data.getString());
        }
    
    }
  • 相关阅读:
    LeetCode【709. 转换成小写字母】
    静态方法、变量与实例方法、变量之比较心得
    用户控件自定义 DependencyProperty 属性使用教程
    TypeLoadException: 未能从程序集“ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“ECS.GUI.Define.ArmgAimPos”,因为它在 4 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠
    ABP 框架实战系列(三)-领域层深入篇
    ABP 框架实战系列(二)- 领域层介绍篇
    ABP框架实战系列(一)-持久层介绍篇
    EF Core 基础知识
    EF Core Migration 报错:An error occurred using the connection to database '' on server '10.28.253.2'
    2020年总结:互联网思维下的工业软件开发
  • 原文地址:https://www.cnblogs.com/baby123/p/11361835.html
Copyright © 2011-2022 走看看