使用WebClient 快速发起请求(不使用WebClientUtils工具类)

使用WebClient发起网络请求_webclient工具类-CSDN博客文章浏览阅读717次,点赞9次,收藏8次。使用WebClient发起网络请求_webclient工具类https://blog.csdn.net/qq_43544074/article/details/137044825这个是使用工具类发起的,下面就不使用工具类进行快速发起。

同样的导入依赖

XML 复制代码
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>3.3.4</version>
</dependency>

然后定义初始化构建一下

java 复制代码
    private final WebClient webClient;

    @Autowired
    public 类名_Controller(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.build();
    }


    // 获取请求地址
    @Value("${dataCenter.dc2DetailUrl}")
    private String dc2DetailUrl;

    @Value("${dataCenter.prePlatformInfoUrl}")
    private String prePlatformInfoUrl;

    @Value("${dataCenter.parmsSetUrl}")
    private String parmsSetUrl;

接下来就可以进行各个方式的请求和调用处理了

GET方式:

java 复制代码
// ==[GET]=========================================
	@ApiOperation("数据查询接口")
    @Synchronized
    @GetMapping("/data-detail")
    public Mono<AjaxResult> dataLoadDetail() throws Exception {
        // 设置请求头信息
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("api_permanent_key", tempToken);
        return webClient.get()
                .uri(dc2DetailUrl)
                // 添加请求头
                .headers(httpHeaders -> httpHeaders.addAll(headers))
                .retrieve()
                .bodyToMono(String.class)
                .map(response -> {
                    log.info("请求数据返回响应 response = " + response);
                    try {
                        // 解析 JSON 数据
                        JSONObject jsonObject = JSONObject.parseObject(response);
                        log.info("请求数据返回响应 jsonObject = " + jsonObject);
                        // 将处理后的数据转换为 AjaxResult 返回
                        return AjaxResult.success(jsonObject);
                    } catch (Exception e) {
                        log.error("数据处理失败: {}", e.getMessage());
                        // JSON 解析失败
                        return AjaxResult.error("数据处理失败" + e.getMessage());
                    }
                })
                .onErrorResume(e -> {
                    log.error(preCountryUrl + "GET 请求失败: {}", e.getMessage());
                    // 这里可以进行更多的日志记录或错误处理
                    return Mono.just(AjaxResult.error("GET 请求失败" + e.getMessage()));
                });
    }

有参数查询:

java 复制代码
    @ApiOperation("查询某个类型下的个体接口")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "platTypeName", value = "类型名称", required = false, dataType = "String", paramType = "query", example = "电器", dataTypeClass = String.class),
            @ApiImplicitParam(name = "platTypeId", value = 类型ID", required = false, dataType = "Integer", paramType = "query", example = "5", dataTypeClass = Integer.class)
    })
    @GetMapping("/pre-platform-info")
    public Mono<AjaxResult> prePlatformInfo(
            @RequestParam(value = "platTypeName", required = false) String platTypeName,
            @RequestParam(value = "platTypeId", required = false) Integer platTypeId) {

        log.info("platTypeName = {}, platTypeId = {}", platTypeName, platTypeId);

        // 设置请求头信息
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("api_permanent_key", tempToken);

        // 构建 URI
        String uri = UriComponentsBuilder.fromHttpUrl(prePlatformInfoUrl)
                .queryParam("platTypeName", platTypeName)
                .queryParam("platTypeId", platTypeId)
                .toUriString();
        log.info("uri = {}", uri);

        return webClient.get()
                .uri(uri)
                .headers(httpHeaders -> httpHeaders.addAll(headers))
                .retrieve()
                .bodyToMono(String.class)
                .map(response -> {
                    log.info("请求数据返回响应 response = {}", response);
                    try {
                        // 解析 JSON 数据
                        JSONObject jsonObject = JSONObject.parseObject(response);
                        // 将处理后的数据转换为 AjaxResult 返回
                        return AjaxResult.success(jsonObject);
                    } catch (Exception e) {
                        log.error("JSON 解析失败", e);
                        // JSON 解析失败
                        return AjaxResult.error("数据处理失败: " + e.getMessage());
                    }
                })
                .onErrorResume(e -> {
                    log.error("GET 请求失败", e);
                    return Mono.just(AjaxResult.error("GET 请求失败: " + e.getMessage()));
                });
    }

POST方式

java 复制代码
	// ==[POST]=========================================
	@ApiOperation("参数设置接口")
    @PostMapping("/set-predict-time")
    public Mono<AjaxResult> setPredictTime(@RequestBody JSONObject jsonObject) throws Exception {
        // 组装请求头
        HashMap<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        // 组装请求体
        String requestBody = jsonObject.toJSONString();
        log.info("请求体是 " + requestBody);
        // 发送请求
        return webClient.post()
                .uri(parmsSetUrl)
                .header(HttpHeaders.CONTENT_TYPE, "application/json")
                .bodyValue(requestBody) // 使用 bodyValue 直接传递请求体
                .retrieve()
                .bodyToMono(String.class)
                .flatMap(this::handleResponse) // 将响应处理逻辑提取到单独的方法中
                .onErrorResume(this::handleError); // 错误处理提取到方法中

    }


    // 处理响应
    private Mono<AjaxResult> handleResponse(String response) {
        log.info("请求数据返回响应 response = {}", response);
        try {
            // 解析 JSON 数据
            JSONObject res = JSONObject.parseObject(response);
            // 将处理后的数据转换为 AjaxResult 返回
            return Mono.just(AjaxResult.success(res.getJSONArray("rows")));
        } catch (Exception e) {
            // JSON 解析失败
            return Mono.just(AjaxResult.error("数据处理失败: " + e.getMessage()));
        }
    }

    // 错误处理
    private Mono<AjaxResult> handleError(Throwable e) {
        log.error("GET 请求失败: {}", e.getMessage(), e);
        return Mono.just(AjaxResult.error("GET 请求失败: " + e.getMessage()));
    }
	
java 复制代码
    @ApiOperation("参数设置接口")
    @PostMapping("/set-predict-time")
    public Mono<AjaxResult> setPredictTime(@RequestBody JSONObject jsonObject) throws Exception {
        // 组装请求头
        HashMap<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        // 组装请求体
        String requestBody = jsonObject.toJSONString();
        log.info("请求体是 " + requestBody);
        // 发送请求
        return webClient.post()
                .uri(parmsSetUrl)
                .header(HttpHeaders.CONTENT_TYPE, "application/json")
                .bodyValue(requestBody) // 使用 bodyValue 直接传递请求体
                .retrieve()
                .bodyToMono(String.class)
                .map(response -> {
                    log.info("请求数据返回响应 response = " + response);
                    try {
                        // 解析 JSON 数据
                        JSONObject res = JSONObject.parseObject(response);
                        // 将处理后的数据转换为 AjaxResult 返回
                        return AjaxResult.success(res);
                    } catch (Exception e) {
                        // JSON 解析失败
                        return AjaxResult.error("数据处理失败" + e.getMessage());
                    }
                })
                .onErrorResume(e -> {
                    // 这里可以进行更多的日志记录或错误处理
                    return Mono.just(AjaxResult.error("POST 请求失败" + e.getMessage()));
                });
    }

至此就可以快速的发起网络请求了!

相关推荐
小羊没烦恼!5 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里5 天前
java中的继承和多态的区别
java
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕5 天前
JSONObject与JSONArray封装数据格式区别
java·json
虎头金猫5 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码5 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖5 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时5 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang5 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi5 天前
mysql 查询所有表名并授权
java