• WebClient配置化封装


    package com.example.webflux.stream;
    
    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.util.StringUtils;
    import org.springframework.web.reactive.function.client.WebClient;
    import org.springframework.web.util.UriComponents;
    import org.springframework.web.util.UriComponentsBuilder;
    import reactor.core.publisher.Mono;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author 李文
     * @create 2022-06-15 11:16
     **/
    public class HttpWebClient
    {
        public static void main(String[] args) {
    
    
            test1();
        }
    
        private static void test1() {
            Data data = new Data();
            data.setUrlPath("http://10.10.12.114:8099/test3/tt");
            data.setContentType("application/json");
            Map<String, String> headers = new HashMap<>();
            headers.put("ua", "ua");
            data.setHeaders(headers);
            data.setHttpMethod("GET");
            Map<String, String> map = new HashMap<>();
            map.put("createBy", "aa");
            data.setBodyMap(map);
            Map<String, String> map2 = new HashMap<>();
            map2.put("aa", "AA");
            map2.put("pageNum", "AA");
            map2.put("pageSize", "AA");
            data.setQueryParam(map2);
    
            System.out.println("输出数据:   " + performed(data, null).block());
        }
    
        static WebClient client = WebClient.create();
    
        /**
         * 具体执行方法
         *
         * @param data    配置数据
         * @param dataMap 上个方法执行结果
         * @return 相应的数据
         */
        public static Mono<Map> performed(Data data, Map<String, Object> dataMap) {
            UriComponents uriComponents = UriComponentsBuilder
                    .fromHttpUrl(data.getUrlPath()).queryParams(data.getQueryParam(dataMap)).build();
            WebClient.RequestBodySpec spec = client
                    .method(data.getHttpMethod())
                    .uri(uriComponents.toUriString())
                    .headers(c -> data.getHeaders(dataMap, c))
                    .contentType(data.getContentType());
            if (data.getBodyMap() != null) {
                return spec.bodyValue(Data.getMapValueObject(data.getBodyMap(), dataMap)).retrieve().bodyToMono(Map.class);
            }
            return spec.retrieve().bodyToMono(Map.class);
        }
    
        public static class Data
        {
            /**
             * 请求类型  GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
             */
            String httpMethod;
            /**
             * 请求路径  URL 地址
             */
            String urlPath;
    
            /**
             * URL 传递的参数
             */
            Map<String, String> queryParam;
    
            /**
             * body 传递的参数
             */
            Map<String, String> bodyMap;
    
            /**
             * 请求头
             */
            Map<String, String> headers;
    
            /**
             * 请求头类型  x-www-form-urlencoded, form-data, application/json, text/plain
             */
            String contentType;
    
    
            public MediaType getContentType() {
                //请求类型  x-www-form-urlencoded, form-data, application/json, text/plain
                switch (this.contentType) {
                    case "application/x-www-form-urlencoded":
                        return MediaType.APPLICATION_FORM_URLENCODED;
                    case "multipart/form-data":
                        return MediaType.MULTIPART_FORM_DATA;
                    case "application/json":
                        return MediaType.APPLICATION_JSON;
                    case "text/plain":
                        return MediaType.TEXT_PLAIN;
                }
                return MediaType.TEXT_PLAIN;
            }
    
            public Data setContentType(String contentType) {
                this.contentType = contentType;
                return this;
            }
    
            public HttpMethod getHttpMethod() {
                //请求类型  GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
                switch (this.httpMethod) {
                    case "GET":
                        return HttpMethod.GET;
                    case "HEAD":
                        return HttpMethod.HEAD;
                    case "POST":
                        return HttpMethod.POST;
                    case "PUT":
                        return HttpMethod.PUT;
                    case "PATCH":
                        return HttpMethod.PATCH;
                    case "DELETE":
                        return HttpMethod.DELETE;
                    case "OPTIONS":
                        return HttpMethod.OPTIONS;
                    case "TRACE":
                        return HttpMethod.TRACE;
                }
                return HttpMethod.GET;
            }
    
            public Data setHttpMethod(String httpMethod) {
                this.httpMethod = httpMethod;
                return this;
            }
    
            public String getUrlPath() {
                return urlPath;
            }
    
            public Data setUrlPath(String urlPath) {
                this.urlPath = urlPath;
                return this;
            }
    
            public MultiValueMap<String, String> getQueryParam(Map<String, Object> dataMap) {
                if (queryParam == null) return null;
                MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
                getMapValueString(queryParam, dataMap).forEach(multiValueMap::add);
                return multiValueMap;
            }
    
    
            public Data setQueryParam(Map<String, String> queryParam) {
                this.queryParam = queryParam;
                return this;
            }
    
            public Map<String, String> getBodyMap() {
                return bodyMap;
            }
    
            public Data setBodyMap(Map<String, String> map) {
                this.bodyMap = map;
                return this;
            }
    
            public HttpHeaders getHeaders(Map<String, Object> map, HttpHeaders c) {
                if (headers != null && headers.size() > 0) {
                    getMapValueString(headers, map).forEach(c::add);
                }
                return c;
            }
    
            public Data setHeaders(Map<String, String> headers) {
                this.headers = headers;
                return this;
            }
    
    
            public static Map<String, String> getMapValueString(Map<String, String> param, Map<String, Object> dataMap) {
                for (Map.Entry<String, String> entry : param.entrySet()) {
                    //  是否有值
                    String value = entry.getValue();
                    if (StringUtils.hasText(value)) {
                        // 提取数据  如  map = {user,atliwen}  ${user} = atliwen
                        if (value.startsWith("${") && value.endsWith("}")) {
                            value = value.substring(2, value.length() - 1);
                            param.put(entry.getKey(), String.valueOf(dataMap.get(value)));
                        }
                    }
                }
                return param;
            }
    
            public static Map<String, Object> getMapValueObject(Map<String, String> param, Map<String, Object> dataMap) {
                Map<String, Object> newObjects = new HashMap<>();
                for (Map.Entry<String, String> entry : param.entrySet()) {
                    //  是否有值
                    String value = entry.getValue();
                    if (StringUtils.hasText(value)) {
                        // 提取数据  如  map = {user,atliwen}  ${user} = atliwen
                        if (value.startsWith("${") && value.endsWith("}")) {
                            value = value.substring(2, value.length() - 1);
                            newObjects.put(entry.getKey(), dataMap.get(value));
                        } else {
                            newObjects.put(entry.getKey(), entry.getValue());
                        }
                    }
                }
    
                return newObjects;
            }
        }
    
    }
  • 相关阅读:
    MATLAB远程桌面打开失败解决办法
    Windows 10 激活步骤
    Windows 10 重装技巧
    Office2019部署代码
    vi命令行命令的积累
    github项目cim(命令行即时通讯), HashedWheelTimer学习笔记
    java读取资源文件/打jar包后读取资源文件的区别
    vmware虚拟机网络配置(物理机能用ssh连接虚拟机, 虚拟机能共享物理机网卡上外网)仅主机模式,nat模式应该也可以
    spring cloud 组件学习 hystrix学习
    netty优化学习积累+++++++
  • 原文地址:https://www.cnblogs.com/atliwen/p/16381110.html
Copyright © 2020-2023  润新知