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; } } }