在Java中,使用HttpUtils实现发送HTTP请求

news/2024/4/28 16:29:17/文章来源:https://blog.csdn.net/weixin_54828627/article/details/129702858

HTTP请求,在日常开发中,还是比较常见的,今天给大家分享HttpUtils如何使用。

阅读本文,你将收获:

  • 简单总结HTTP请求常用配置;
  • JavaLib中HttpUtils如何使用;
  • 如何封装HTTP请求工具类。

第一部分:简单总结HTTP请求常用配置

大家好,在 Java 开发中,经常遇到需要调用第三方提供的接口服务,常见的形式是 HTTP + JSON,下面,就对 http 请求常见的设置,做一个说明

http提供多种请求方式,以满足我们日常需要,先按请求方式来做说明:

  • GET
  • POST
  • PUT
  • PATCH
  • DELETE

在 RESTful API 开发中,我们可以根据这些请求方式设计我们的API接口。举例:

  • GET:获取资源
  • POST:提交资源
  • PUT:更新完整资源
  • PATCH:更新部分资源
  • DELETE:删除资源

参数格式

  • form表单
  • json

其他

  • 超时时间设置

第二部分:使用JavaLib的HttpUtils

简单的get请求

System.out.println(HttpUtils.get("https://www.baidu.com"));

响应结果:

<!DOCTYPE html><!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

通过简单尝试,证明两点:

  • 一是,这个还是可以使用的;
  • 二是,原来使用如此简单。

如果要你手写一个http请求,或许你脑海里一篇空白,会去搜索各种资料。

我们再试一个复杂的

接口:

接口地址:https://erwin-api.fengwenyi.com/erwin/blog/page
请求方法:GET
参数:currentPage,pageSize
参数格式:form
响应:application/json

String url = "https://erwin-api.fengwenyi.com/erwin/bookmark/page?currentPage=1&pageSize=10";Request request = new Request();
request.setUrl(url);
request.setMethod(Request.Method.GET);Map<String, String> headerMap = new HashMap<>();
headerMap.put("Accept", "application/json");Request.Option option = new Request.Option();
option.setHeaders(headerMap);try {System.out.println(HttpUtils.execute(request, option));
} catch (IOException e) {throw new RuntimeException(e);
}

响应结果:

{"code":"SUCCESS","message":"Success","success":true,"header":null,"body":{"currentPage":1,"pageSize":10,"totalRows":661,"totalPages":67,"content":[{"id":"1634772578877935617","timestamp":1678595130000,"enabledState":null,"name":"VScode 中文显示出现黄色方框的解决方法_vscode汉字被框住_YJer的博客-CSDN博客","url":"https://blog.csdn.net/qq_33249042/article/details/123252625","icon":null,"classifyName":"软件","classifyId":"1522587269600481281"},{"id":"1632640455110922241","timestamp":1678086792000,"enabledState":null,"name":"Spring中init-method和destroy-method的四种方式_星夜孤帆的博客-CSDN博客","url":"https://blog.csdn.net/qq_38826019/article/details/117387398","icon":null,"classifyName":"Spring","classifyId":"1522586360887742466"},{"id":"1631597310596190209","timestamp":1677838087000,"enabledState":null,"name":"vue3 + elemenplus实现导航栏 - 掘金","url":"https://juejin.cn/post/7084871748608327687","icon":null,"classifyName":"前端","classifyId":"1525554881275990018"},{"id":"1631593154401636354","timestamp":1677837096000,"enabledState":null,"name":"Spring bean 创建过程源码解析 - 腾讯云开发者社区-腾讯云","url":"https://cloud.tencent.com/developer/article/1631160","icon":null,"classifyName":"Spring","classifyId":"1522586360887742466"},{"id":"1631592987673858050","timestamp":1677837056000,"enabledState":null,"name":"SpringBoot之容器启动源码分析与Bean加载_springboot加载bean 源码_minemine0418的博客-CSDN博客","url":"https://blog.csdn.net/minemine0418/article/details/102308912","icon":null,"classifyName":"Spring Boot","classifyId":"1522586446766116865"},{"id":"1631586585454678018","timestamp":1677835530000,"enabledState":null,"name":"Spring-Bean生命周期 - 知乎","url":"https://zhuanlan.zhihu.com/p/158468104","icon":null,"classifyName":"Spring","classifyId":"1522586360887742466"},{"id":"1631579732104548354","timestamp":1677833896000,"enabledState":null,"name":"一文读懂 Spring Bean 的生命周期_spring bean的生命周期_老周聊架构的博客-CSDN博客","url":"https://blog.csdn.net/riemann_/article/details/118500805","icon":null,"classifyName":"Spring","classifyId":"1522586360887742466"},{"id":"1630768897186697218","timestamp":1677640578000,"enabledState":null,"name":"MySQL同时统计多个条件的记录条数_ztnhnr的博客-CSDN博客","url":"https://blog.csdn.net/ztnhnr/article/details/107165942","icon":null,"classifyName":"MySQL","classifyId":"1522586805693681666"},{"id":"1630768792098410497","timestamp":1677640553000,"enabledState":null,"name":"sql查询近七天,近两周,近一个月的数据_sql最近一周数据_心诚则灵'的博客-CSDN博客","url":"https://blog.csdn.net/wenchangwenliu/article/details/119891790","icon":null,"classifyName":"MySQL","classifyId":"1522586805693681666"},{"id":"1630480535938764801","timestamp":1677571827000,"enabledState":null,"name":"开源流程引擎哪个好,如何选型? - 知乎","url":"https://zhuanlan.zhihu.com/p/369761832","icon":null,"classifyName":"Java","classifyId":"1522586296119300097"}]}
}

响应结果,还是符合预期的。

当然,HTTP还有其他,比如超时等等,下面看看完整版的请求示例:

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("currentPage", 1);
paramMap.put("pageSize", 10);Map<String, String> headerMap = new HashMap<>();
headerMap.put("Accept", "application/json");Request request = new Request();
request.setUrl("https://erwin-api.fengwenyi.com/erwin/bookmark/page");
request.setParam(paramMap);
request.setMethod(Request.Method.GET);
request.setUtil(Request.Util.OkHttp);Request.Option option = new Request.Option();
option.setHeaders(headerMap);
option.setConnectTimeoutSecond(3);
option.setReadTimeoutSecond(5);
option.setLogLevel(Request.LogLevel.DEBUG);try {String result = HttpUtils.execute(request, option);System.out.println(result);
} catch (IOException e) {throw new RuntimeException(e);
}

响应结果也是跟上面一样的。

第三部分:分享HttpUtils是如何封装的

首先是 RequestResponse 对应HTTP的请求和响应,包路径如下:

  • com.fengwenyi.javalib.http.Request
  • com.fengwenyi.javalib.http.Response

另外,com.fengwenyi.javalib.http.Request.Option 来存放HTTP参数配置。

这一部分的思路来源是 Spring Cloud OpenFeign。

为了兼容多种HTTP工具实现请求,引入了 HttpClientFactory,其他工具类,只要实现 HttpClient 接口,就行。

  • com.fengwenyi.javalib.http.client.HttpClient
  • com.fengwenyi.javalib.http.client.HttpClientFactory

欧克,下面我们就以代码来看看:

HttpUtils#execute

public static String execute(Request request, Request.Option option) throws IOException {check(request);HttpClient httpClient = HttpClientFactory.get(request.getUtil());Response response = httpClient.execute(request, option);return handleResponse(response);
}

HttpClientFactory#get

public static HttpClient get(Request.Util httpUtil) {if (Request.Util.JDK == httpUtil) {return new JdkHttpClient();} else if (Request.Util.OkHttp == httpUtil) {return new OkHttpClient();} else {throw new RuntimeException("not find http util: " + httpUtil.name());}
}

所以,只需要实现 HttpClient#execute 接口就行。

Response execute(Request request, Request.Option option) throws IOException;

 

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

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

相关文章

【Unity入门】3D物体

【Unity入门】3D物体 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;物体移动旋转缩放 &#xff08;1&#xff09;物体移动 在上一篇文章【Unity入门】场景视图操作我们学会了在场景中创建3…

开源供应链管理系统 S2B2B2C系统方案及源码输出

连锁供应链的管理&#xff0c;包括供应链的仓库管理、业务员管理、门店订货管理、门店管理、门店前端拓客管理&#xff0c;相关的功能结构图如下&#xff1a; 整个方案含PC、小程序端&#xff0c;源码&#xff01; 功能列表&#xff1a; 仓库管理&#xff1a;包括仓库布局、库存…

Fabric系列 - TLS身份验证

排序节点&#xff08;Orderer&#xff09;要启用TLS身份验证 对等节点&#xff08;Peer&#xff09;要启用TLS的身份验证 Gossip 消息传递 gossip 层使用 TLS 绑定来验证连接另一端的对等方的身份。 通过 Peer 节点 TLS 层来处理点对点消息的安全性&#xff0c;不需要使用签名…

OpenAI创始人:GPT-4的研究起源和构建心法

OneFlow编译 翻译&#xff5c;杨婷、贾川、徐佳渝 三十年前&#xff0c;互联网&#xff08;Web 1.0&#xff09;时代开启。人们只能在笨重的电脑上用鼠标点击由HTML编写的网页文本&#xff0c;随后开始支持插入图片&#xff0c;可以上传视频&#xff0c;于是有了网络新闻、搜索…

一次小破站JS代码审计出XSS漏洞思路学习

今天看了小破站一个大佬的分析&#xff0c;感觉思路很有意思&#xff0c;感兴趣的xdm可以到大佬视频下提供的链接进行测试&#xff08;传送门&#xff09;这类社交平台的XSS漏洞利用起来其实危害是特别大的&#xff0c;利用XSS能在社交平台上呈现蠕虫式的扩散&#xff0c;大部分…

【人人都能读标准】10. 作用域链与闭包

本文为《人人都能读标准》—— ECMAScript篇的第10篇。我在这个仓库中系统地介绍了标准的阅读规则以及使用方式&#xff0c;并深入剖析了标准对JavaScript核心原理的描述。 在8.执行环境我们说过&#xff0c;由ECMAScript代码创建的执行上下文会有一个词法环境的组件&#xff0…

【Effective C++详细总结】第四章 设计与声明

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…

Flink-转换算子

基本转换算子 map(映射) filter&#xff08;过滤&#xff09; flatMap&#xff08;扁平映射&#xff09; 聚合算子 keyBy&#xff08;按键分区&#xff09; 简单聚合 reduce&#xff08;归约聚合&#xff09; UDF介绍 函数类 富函数类 数据源读入数据之后&#xff0c;我们就可…

Neodynamic EPLPrinter SDK 2.0 for .NET Crack

Neodynamic EPLPrinter Emulator SDK for .NET Standard V2.0 添加对 FK&#xff08;删除表单&#xff09;、FR&#xff08;检索表单&#xff09;和 FS&#xff08;存储表单&#xff09;表单相关命令的支持。 21月 2023&#xff0c; 10 - 34&#xff1a;<>新版本 特征…

如何在24小时内让你的网站跻身谷歌前列?

在当今互联网时代&#xff0c;拥有一个排名靠前的网站对于企业来说非常重要&#xff0c;因为这意味着更多的流量和更高的曝光率。 而谷歌&#xff08;Google&#xff09;是全球最受欢迎的搜索引擎之一&#xff0c;因此在谷歌的搜索结果中排名靠前非常重要。 那么如何在24小时…

tomcat服务器前端部署【Tomcat Manager、思路分析】

问题描述 当前需要我进行前端代码的部署&#xff0c;但是我忘记了这个系统对应的部署位置&#xff0c;但是隐约记得好像是通过tomcat部署的。 然后当时为了方便部署&#xff0c;我们打开了Tomcat Manager 以下是基于Tomcat Manager的&#xff0c;没有打开的需要前往tomcat下载…

详解:企业知识管理的制作步骤!

随着信息技术的快速发展&#xff0c;企业面临着海量的信息和知识&#xff0c;如何管理和利用这些信息和知识&#xff0c;已经成为企业发展的重要问题。知识管理是一种管理方法和技术&#xff0c;旨在帮助企业有效地管理和利用知识资产&#xff0c;提高企业的创新能力和竞争力。…

【CSS】浮动 ② ( 浮动语法简介 | 文字环绕效果 | 左浮动 | 右浮动 )

文章目录一、浮动语法简介1、语法说明2、没有浮动的效果3、左浮动的效果4、右浮动的效果5、右浮动 外边距效果二、完整代码示例一、浮动语法简介 1、语法说明 为 元素 设置了 浮动 CSS 属性 , 可以实现 : 元素标签 不再受 标准流 控制 ; ( 块级元素 , 行内元素 , 行内块元素 …

【嵌入式Linux学习笔记】platform设备驱动和input子系统

对于Linux这种庞大的操作系统&#xff0c;代码重用性非常重要&#xff0c;所以需要有相关的机制来提升效率&#xff0c;去除重复无意义的代码&#xff0c;尤其是对于驱动程序&#xff0c;所以就有了platform和INPUT子系统这两种工作机制。 学习视频地址&#xff1a;【正点原子…

【JavaSE】泛型中的通配符

文章目录1. 概述2. 上界通配符 < ? extends E>3. 下界通配符 < ? super E>3. &#xff1f;和 T 的区别1. 概述 Java 泛型&#xff08;generics&#xff09;是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制&#xff0c;该机制允许开发者在编译时…

【QT神奇Bug】中文乱码、括号乱码、冒号乱码【2023.03.22】

&#x1f60d;Qt乱码疑难杂症解决方案 Solved by Yang Naifen. &#x1f4fa;视频讲解地址&#xff1a;【Qt疑难杂症之乱码-哔哩哔哩】 https://b23.tv/83MmXru 附言&#xff1a;解决这个bug按照我当前的薪资&#xff0c;至少四百RMB。都是工农阶级的工友&#xff0c;有bug一…

本地调试Java程序时只对部分接口忽略代理

场景 今天有位朋友问了个问题&#xff0c;在本地IDE开发工具调试代码的时候&#xff0c;怎么不动代码的情况只针对部分API走proxy&#xff0c;因为他们的代码只需要在本地调试的时候才要用到Proxy&#xff0c;而平时都是部署在云上&#xff0c;是用不到Proxy的&#xff0c;所以…

JDBC基础,介绍了简单的连接数据库,并通过在后端写SQL语句对数据库进行基本的增删查改操作

一、JDBC基础 跟数据库连接&#xff0c;并且可以对数据库里面的数据通过SQL语句进行处理等操作。 1.1 JDBC JDBC是SUN公司的&#xff0c;所以要按照他们的规范来&#xff0c;因为MYSQL和Oracle都是SUN公司的。三个产品都是一个公司的&#xff0c;一般不会出现兼容性不好的问…

智能手机2023:高端前攻、中端后守

配图来自Canva可画 沉寂许久的行业&#xff0c;终于在疫情之后迎来了久违的舞台&#xff0c;MWC线下展会三年来第一次召开。2月27日至3月2日&#xff0c;2023年世界移动通讯大会如期在巴塞罗那举行&#xff0c;国内一众手机厂商们纷纷登台亮相、大秀肌肉。与以往相比&#xff…

Rocketmq-Mqtt 开发实例

一、RocketMQ MQTT 概览传统的消息队列MQ主要应用于服务&#xff08;端&#xff09;之间的消息通信&#xff0c;比如电商领域的交易消息、支付消息、物流消息等等。然而在消息这个大类下&#xff0c;还有一个非常重要且常见的消息领域&#xff0c;即IoT类终端设备消息。近些年&…