WebClient发送Web请求(post get)

1.参考

1.Spring WebClient 教程

2.Netty客户端-配置DNSResolution超时

2.创建WebClient

/**
 * 创建 webclient实例
 * @return webclient实例
 */
 public WebClient buildWebClient(){
   return WebClient.builder()
      .clientConnector(new ReactorClientHttpConnector(buildHttpClient()))
      .build();
}


/**
     * 创建 http client 实例
     *
     * 通过 ChannelOption.CONNECT_TIMEOUT_MILLIS 选项设置连接超时间。
     * 分别使用 ReadTimeoutHandler 和写 WriteTimeoutHandler 设置读、写超时。
     * 使用 responseTimeout 指令配置响应超时。
     *
     * @return HttpClient
     */
    private HttpClient buildHttpClient() {
        try{
            SslContext sslContext = SslContextBuilder
                    .forClient()
                    .trustManager(InsecureTrustManagerFactory.INSTANCE)
                    .build();

            return HttpClient.create()
                    // 忽略https 安全证书检查 可选项
                    .secure(t -> t.sslContext(sslContext))
                    // 设置DNS查询超时时间 解决 io.netty.resolver.dns.DnsNameResolverTimeoutException
                    .resolver(spec -> spec.queryTimeout(Duration.ofSeconds(20)))
                    .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 30 * 1000)
                    .responseTimeout(Duration.ofMillis(30 * 1000L))
                    .doOnConnected(conn ->
                            conn.addHandlerLast(new ReadTimeoutHandler(30 * 1000L, TimeUnit.MILLISECONDS))
                                    .addHandlerLast(new WriteTimeoutHandler(30 * 1000L, TimeUnit.MILLISECONDS)));
        }catch (SSLException e){
            log.error("创建HttpClient出错{}", e.getMessage());
            throw exception(CREATE_HTTP_CLIENT_FAIL);
        }

    }

3.发送post与get请求

public String getWeb(){

        String res =  buildWebClient()
                .get()
                .uri( 请求的地址(http://localhost:12345/api/get),
                        // 构造query参数
                        uriBuilder -> uriBuilder
                                .queryParam("参数名1", "值1")
                                .queryParam("参数名2", "值2")
                                .build()
                        )
                // 请求头
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .exchangeToMono(response -> response.bodyToMono(String.class))
                .block();
        return res;
    }
public String postWeb(){

        String res =  buildWebClient()
                .post()
                .uri( 请求的地址(http://localhost:12345/api/get))
                // 请求头
                .bodyValue(body参数)
                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .exchangeToMono(response -> response.bodyToMono(String.class))
                .block();
        return res;
    }

在获取响应中,.exchangeToMono(response -> response.bodyToMono(String.class))可以有更加详细的写法

.exchangeToMono(response -> {
  if (response.statusCode().equals(HttpStatus.OK)) {
      return response.bodyToMono(String.class);
  } else if (response.statusCode().is4xxClientError()) {
      return Mono.just("Error response");
  } else {
      return response.createException()
        .flatMap(Mono::error);
  }
});

4.个人遇到的问题

1.io.netty.resolver.dns.DnsNameResolverTimeoutException异常

在发送http请求时,不是直接的ip,需要DNS解析,我在发送请求的时候,总是报DNS解析超时。解决办法就是创建httpClient时,延长DNS查询时间。

.resolver(spec -> spec.queryTimeout(Duration.ofSeconds(20)))

2.响应解析

因为获取的响应是String形式的,如何把String解析成想要获取的信息了,个人的做法是通过JSONObject和JSON.parseArray解析。

/**
     * 解析返回 并封装
     * @param response 返回
     * @return 封装后的响应
     */
    private BaseResponse<String> parseResponse(String response){
        try {
            JSONObject json = JsonUtils.parseObject(response);
            // code 为200 表明成功
            int code = json.get("code", Integer.class);
            if (code == HttpStatus.OK.value()) {
                String data = json.get("result", String.class);
                return BaseResponse.success(data);
            } else {
                log.error("接口访问失败{}", response);
                return BaseResponse.fail(code, json.getStr("message"));
            }
        }catch (Exception e){
            log.error("解析{}响应出错,{}", response, e.getMessage());
            return BaseResponse.fail(e.getMessage());
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/771271.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何选择快手矩阵系统:打造高效短视频营销的指南

快手作为中国领先的短视频社交平台&#xff0c;为内容创作者和品牌提供了广阔的展示舞台。为了更高效地管理和扩展在快手上的影响力&#xff0c;快手矩阵系统成为了一个重要的工具。本文将指导您如何选择一个合适的快手矩阵系统&#xff0c;以优化您的内容管理和营销策略。 快…

Kotlin和Java的一些不同点

1.Kotlin 的变量是没有默认值的&#xff08;因此要求初始化&#xff09;&#xff0c;Java的成员变量是有默认值的 Java的成员变量&#xff1a; String name; // 默认值是 null int count; // 默认值是 0不过其实 Java 也只是成员变量有默认值&#xff0c;局部变量也是没有默…

中俄汽车产业链合作前景广阔,东方经济论坛助力双边合作与创新

随着中国汽车零部件企业的竞争力和创新能力不断增强&#xff0c;中国汽车及零部件行业在俄罗斯的市场份额和品牌影响力显著提升&#xff0c;中俄两国在汽车产业链上的合作展现出巨大的潜力和广阔的前景。2024年5月&#xff0c;俄罗斯乘用车新车销量达到12.8万辆&#xff0c;同比…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验15 网络故障导致的路由环路问题

一、实验目的 1.验证因网络故障而导致的静态路由的路由环路问题&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证网络故障导致的…

LTSPICE仿真电路:(十九)磁珠的一些简单仿真

1.作用 简单来说就是用来滤波的&#xff0c;将高频信号转化为热量滤除掉&#xff0c;低频有用信号正常通过 2.参数 上图几个参数比较简单&#xff0c;就是字面上的意思&#xff0c;更重要的就是频率阻抗图 不同曲线代表不同型号的磁珠&#xff0c;实际上除了额定电流外&#…

Spring框架的学习SpringMVC(1)

1.什么是MVC (1)MVC其实就是软件架构的一种设计模式&#xff0c;它将软件的系统分为&#xff0c;&#xff08;视图&#xff0c;模型&#xff0c;控制器&#xff09;三个部分 1.1View(视图) 视图也就是&#xff0c;在浏览器显示的那一个部分&#xff0c;是后端数据的呈现 1.…

某DingTalk企典 - Token

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识&#xff0c;欢迎私信共享学习心得。 如有侵权&#xff0c;联系博主删除。 请勿商用&#xff0c;否则后果自负。 网址 aHR0cHM6Ly9kaW5ndGFsay5jb20vcWlkaWFuLw 浅聊一下 没毛病&#xff0c;就这字段&#xff0c;有效期…

二叉树与堆相关的时间复杂度问题

目录 满二叉树与完全二叉树高度h和树中节点个数N的关系 向上调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向下调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向上调整建堆&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a;…

9.x86游戏实战-汇编指令mov

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

怎么找到DNS服务器的地址?

所有域都注册到域名名称服务器&#xff08;DNS&#xff09;点&#xff0c;以解析域名应指向的IP地址。此查找类似于在查找个人名称并查找其电话号码时的电话簿如何运行。如果DNS服务器设置错误或指向错误的名称服务器&#xff0c;则域可能无法加载相应的网页。 如何查找当前的…

【python基础】—calendar模块

文章目录 前言一、calendar模块方法1.firstweekday()2.setfirstweekday(firstweekday)3.isleap(year)4.leapdays(y1, y2)5.weekday(year, month, day)6.monthrange(year, month)7.weekheader(n)8.monthcalendar(year, month)9.prmonth(theyear, themonth, w0, l0)10.prcal(year…

堆结构、堆排序

堆 是完全二叉树&#xff0c;类似这种样式的 而这种有右子节点&#xff0c;没左子节点的就不是完全二叉树 分为大根堆和小根堆 大根堆是二叉树里每一颗子树的父节点都是这颗子树里最大的&#xff0c;即每一棵子树最大值是头节点的值 小根堆相反 把数组中从0开始的一段数人…

【等保2.0是什么意思?等保2.0的基本要求有哪些? 】

一、等保2.0是什么意思&#xff1f; 等保2.0又称“网络安全等级保护2.0”体系&#xff0c;它是国家的一项基本国策和基本制度。在1.0版本的基础上&#xff0c;等级保护标准以主动防御为重点&#xff0c;由被动防守转向安全可信&#xff0c;动态感知&#xff0c;以及事前、事中…

Stable Diffusion图像的脸部细节控制——采样器全解析

文章目录 艺术地掌控人物形象好易智算原因分析为什么在使用Stable Diffusion生成全身图像时&#xff0c;脸部细节往往不够精细&#xff1f; 解决策略 局部重绘采样器总结 艺术地掌控人物形象 在运用Stable Diffusion这一功能强大的AI绘图工具时&#xff0c;我们往往会发现自己…

开源的基于图像识别本地实名认证系统(本项目不借助任何api) v1.0

前言: 本项目主要是代替昂贵的实名认证服务api或者sdk&#xff0c;目前仍然存在很多缺点 一、具体介绍 1.组成: 人脸识别服务器分为两部分: (1)、http服务端 server.py共有四个函数: DrawFaceinIdCard:用户上传身份证图片后&#xff0c;服务端会对身份证进行抠人像和ocr处理…

澳蓝荣耀时刻,6款产品入选2024年第一批《福州市名优产品目录》

近日&#xff0c;福州市工业和信息化局公布2024年第一批《福州市名优产品目录》&#xff0c;澳蓝自主研发生产的直接蒸发冷却空调、直接蒸发冷却组合式空调机组、间接蒸发冷水机组、高效间接蒸发冷却空调机、热泵式热回收型溶液调湿新风机组、防火湿帘6款产品成功入选。 以上新…

正交的拉丁方阵(MOLS)

在组合数学中&#xff0c;如果两个同阶的拉丁方阵叠加后&#xff0c;每个位置上的有序对条目都是唯一的&#xff0c;则这两个拉丁方阵被称为正交的。 如果一组同阶的拉丁方阵中&#xff0c;任意两个方阵都是正交的&#xff0c;则这组方阵被称为一组相互正交的拉丁方阵&#xf…

Prometheus 监控Kubelet的运行状态

kubelet通过/metrics暴露自身的指标数据。kubelet有两个端口都提供了这个url&#xff0c;一个是安全端口&#xff08;10250&#xff09;&#xff0c;一个是非安全端口&#xff08;10255&#xff0c;kubeadm安装的集群该端口是关闭的&#xff09;。安全端口使用https协议&#x…

SpringMVC的架构有什么优势?——控制器(一)

文章目录 控制器(Controller)1. 控制器(Controller)&#xff1a;2. 请求映射(Request Mapping)&#xff1a;3. 参数绑定(Request Parameters Binding)&#xff1a;4. 视图解析器(View Resolver)&#xff1a;5. 数据绑定(Data Binding)&#xff1a;6. 表单验证(Form Validation)…

02-部署LVS-DR群集

1.LVS-DR工作原理 LVS-DR模式&#xff0c;Director Server作为群集的访问入口&#xff0c;不作为网购使用&#xff0c;节点Director Server 与 Real Server 需要在同一个网络中&#xff0c;返回给客户端的数据不需要经过Director Server 为了响应对整个群集的访问&#xff0c;…