java get请求简洁,java 实现 HTTP请求(GET、POST)的方法

使用Java进行服务调用时,避免不了要使用模拟HTTP请求来实现模拟,我在开发过程中恰巧遇到了这类的业务需求,所以就对这类的方法进行了一次总结,原理层次的东西暂时不考虑,毕竟HTTP的底层实现啥的,东西挺多且挺复杂的,对我的项目而言,理解这些东西并不能从直观上得到很明显的提升或帮助,还是代码来的比较实在,so,贴出几种方法的总结,用作备份,免的日后再重复造轮子。

第一种:白痴方案,最原始的解决方案

功能暂时是实现了,但是里面会涉及到通用性和性能等的问题,暂时不考虑

public class HttpRequest {

private static final Logger LOGGER = LoggerFactory.getLogger(HttpRequest.class.getName());

/**

* 向指定URL发送GET方法的请求

*

* @param url 发送请求的URL

* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。

* @return URL 所代表远程资源的响应结果

*/

public static String sendGet(String url, String param) {

StringBuilder result = new StringBuilder();

BufferedReader bufferedReader = null;

try {

String urlNameString = url + "?" + param;

URL realUrl = new URL(urlNameString);

// 打开和URL之间的连接

URLConnection connection = realUrl.openConnection();

// 设置通用的请求属性

connection.setRequestProperty("accept", "*/*");

connection.setRequestProperty("connection", "Keep-Alive");

connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

// 建立实际的连接

connection.connect();

// 获取所有响应头字段

Map> map = connection.getHeaderFields();

// 遍历所有的响应头字段

for (String key : map.keySet()) {

LOGGER.info("key : {}", map.get(key));

System.out.println(key + "--->" + map.get(key));

}

// 定义 BufferedReader输入流来读取URL的响应

bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

String line;

while ((line = bufferedReader.readLine()) != null) {

result.append(line);

}

} catch (Exception e) {

LOGGER.error("HTTP GET error : {}", e.getMessage());

}

// 使用finally块来关闭输入流

finally {

try {

if (bufferedReader != null) {

bufferedReader.close();

}

} catch (Exception e2) {

e2.printStackTrace();

}

}

return result.toString();

}

/**

* 向指定 URL 发送POST方法的请求

*

* @param url 发送请求的 URL

* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。

* @return 所代表远程资源的响应结果

*/

public static String sendPost(String url, String param) {

LOGGER.info("url : {}", url);

LOGGER.info("param : {}", param);

PrintWriter out = null;

BufferedReader in = null;

StringBuilder result = new StringBuilder();

try {

URL realUrl = new URL(url);

// 打开和URL之间的连接

URLConnection conn = realUrl.openConnection();

// 设置通用的请求属性

conn.setRequestProperty("accept", "*/*");

conn.setRequestProperty("connection", "Keep-Alive");

conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

conn.setRequestProperty("accept-language", "en-US,en;q=0.5");

// 发送POST请求,必须设置如下两行

conn.setDoOutput(true);

conn.setDoInput(true);

// 获取URLConnection对象对应的输出流

out = new PrintWriter(conn.getOutputStream());

// 发送请求参数

out.print(param);

// flush输出流的缓冲

out.flush();

// 定义BufferedReader输入流来读取URL的响应

in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String line;

while ((line = in.readLine()) != null) {

result.append(line);

}

} catch (Exception e) {

LOGGER.error("HTTP POST error : {}", e.getMessage());

}

//使用finally块来关闭输出流、输入流

finally {

try {

if (out != null) out.close();

if (in != null) in.close();

} catch (IOException ex) {

LOGGER.error("close IO error : {}", ex.getMessage());

}

}

return result.toString();

}

}

第二种:升级版本,基于上个版本进行的简化版,看起来更简洁一些

public class HttpClientUtil {

private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientUtil.class.getName());

public static String sendGet(String url, String param) throws IOException {

LOGGER.info("request url info : {}", url);

HttpGet request = new HttpGet(url + "?" + param);

return send(request);

}

public static String sendPost(String url, String param) throws IOException {

LOGGER.info("request url info : {}", url);

HttpPost request = new HttpPost(url);

request.setEntity(

new StringEntity(param, ContentType.create("application/json;charset=UTF-8"))

);

return send(request);

}

private static String send(HttpRequestBase request) throws IOException {

String message = "";

request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) ...");

request.setHeader("accept", "*/*");

request.setHeader("connection", "Keep-Alive");

CloseableHttpClient httpclient = HttpClients.createDefault();

CloseableHttpResponse response = httpclient.execute(request);

HttpEntity entity = response.getEntity();

ByteArrayOutputStream outStream = new ByteArrayOutputStream();

if (entity != null) {

long length = entity.getContentLength();

if (length != -1 && length < 2048) {

message = EntityUtils.toString(entity);

} else {

InputStream in = entity.getContent();

byte[] data = new byte[4096];

int count;

while ((count = in.read(data, 0, 4096)) != -1) {

outStream.write(data, 0, count);

}

message = new String(outStream.toByteArray(), "UTF-8");

}

}

LOGGER.info(">>>>>>>>>>>>>>>>>response message info : {}", message);

return message;

}

}

第三种:使用第三方工具包

这一种方案,彻底告别了傻瓜式的轮子创造过程,直接使用开源的,已封装好的代码工具来实现这一过程,但是有个问题就是,他会产生轮询日志,以此保持链接通讯,如果看着不爽,可以改源码里的配置,或者使用log4j2中的日志过滤器,直接将他的日志过滤掉,并只打印程序的日志信息,看起来更清爽一些

PS:这个工具包全方位支持RESFUL请求方式,这里只列举常用的两种,其他的请自行实验

public class UnirestUtil {

private static final Logger LOGGER = LoggerFactory.getLogger(UnirestUtil.class.getName());

/**

*

* @param url 目标url

* @param name 参数名称

* @param param 请求参数

* @return 网络传输状态码或请求结果

*/

public static HttpResponse sendGet(String url, String name, String param) throws UnirestException {

LOGGER.debug("request url info : {}", url);

HttpResponse response = Unirest.get(url)

.header("accept", "application/json;charset=UTF-8")

.queryString(name, param)

.asString();

LOGGER.debug("response status info : {}", response.getStatus());

LOGGER.debug("response status message info : {}", response.getStatusText());

return response;

}

/**

*

* @param url 目标url

* @param name 参数名称

* @param param 请求参数实体

* @return 网络传输状态码

*/

public static HttpResponse sendPost(String url, String name, String param) throws UnirestException {

LOGGER.debug("request url info : {}", url);

HttpResponse response = Unirest.post(url)

.header("accept", "application/json;charset=UTF-8")

.queryString(name, param)

.asString();

LOGGER.debug("response status info : {}", response.getStatus());

LOGGER.debug("response status message info : {}", response.getStatusText());

return response;

}

}

OK,至此,几种方案都贴出来了,可能还有更简洁可靠的方案来实现这个功能,但是我还没找到,如果您有更好的方法,请留言交流,分享出来吧,谢谢。

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

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

相关文章

如何在 ASP.NET Core 中使用 LazyCache

微软的 ASP.NET Core 已经是一个非常流行的用于构建 高性能, 模块化 并能运行在 Windows, Linux, MacOS 上的 WEB 框架&#xff0c;通常能够让程序保持高性能的一个有效途径就是通过缓存热链上的数据来应对高频的请求。LazyCache 是一款基于内存的易于使用和线程安全的缓存组件…

伪装 php 版本号,linux伪装隐藏Nginx,PHP版本号提升服务器安全性

一、隐藏Nginx版本号第一步&#xff1a;vi /usr/local/nginx/conf/nginx.conf在http{}中加入server_tokens off;第二歩&#xff1a;vi /usr/local/nginx/conf/fastcgi_params将里面的fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;修改为&#xff1a;fastcgi_param SERV…

2018全球大学AI排名发布,中国高校表现强势!

[导读] 近日&#xff0c;麻省理工学院马萨诸塞校区计算机与信息科学学院教授 Emery Berger 发布一个全球院校计算机科学领域实力排名的开源项目 CSranking 更新了。目前&#xff0c;卡耐基梅隆大学&#xff08;CMU&#xff09;、麻省理工学院&#xff08;MIT&#xff09;与斯坦…

在C#中使用 CancellationToken 处理异步任务

在 .NET Core 中使用异步编程已经很普遍了&#xff0c; 你在项目中随处可见 async 和 await&#xff0c;它简化了异步操作&#xff0c;允许开发人员&#xff0c;使用同步的方式编写异步代码&#xff0c;你会发现在大部分的异步方法中&#xff0c;都提供了CancellationToken参数…

RHEL 5.4下cyrus-sasl-2.1.22 的编译安装

我们直接从编译前的配置开始&#xff1a; 1)编译前的配置 #./configure --disable-anon --enable-login --enable-ntlm --with-saslauthd/var/run/saslauthd 2&#xff09;编译并安装 #make ; make install 3&#xff09;建立库文件的链接文件 #ln -s /usr/loca…

通过Python实现马尔科夫链蒙特卡罗方法的入门级应用

通过把马尔科夫链蒙特卡罗&#xff08;MCMC&#xff09;应用于一个具体问题&#xff0c;本文介绍了 Python 中 MCMC 的入门级应用。GitHub 地址&#xff1a;https://github.com/WillKoehrsen/ai-projects/blob/master/bayesian/bayesian_inference.ipynb过去几月中&#xff0c;…

Java如何控制用户输入的长度,用Java Applet 进行Web编程时,如何限制输入域中可输入字符的长度!解决后马上给分!!!...

用Java Applet 进行Web编程时&#xff0c;如何限制输入域中可输入字符的长度&#xff01;解决后马上给分&#xff01;&#xff01;&#xff01;|create a new class FixLengthDocument extends PlainDocument, override public void insertString(int offs, String str, Attrib…

315曝光不良奸商 对企业不能罚酒三杯

3月15日&#xff0c;315晚会又曝光了一批无良奸商&#xff0c;虽然315晚会年年曝光&#xff0c;各地政府也迅速跟进打击&#xff0c;但侵害消费者权益的情况却屡见不鲜。从被曝光企业的道歉信来看&#xff0c;“承认错误只是个别问题全面排查整改配合管理部门执法向消费者表示道…

.NET 产品版权保护方案 (.NET源码加密保护)

一. 前言大家好&#xff0c;我是康世杰&#xff0c;大家可以叫我Jason。我和大家一样&#xff0c;都是搞技术出身&#xff0c;也未当过讲师&#xff0c;所以口材有限&#xff0c;如果讲得不好之处&#xff0c;还希望大家多多海含&#xff0c;谢谢。今天是我们第一次见面&…

java地图 热力图,腾讯地图数据可视化之热力图

前言数据可视化API(Web)&#xff0c;是基于腾讯位置服务JavaScript API GL实现的专业地理空间数据可视化渲染引擎。 通过这套API&#xff0c;可以实现轨迹数据、坐标点数据、热力、迁徙、航线等空间数据的可视化展现。使用步骤1、注册成为腾讯位置服务开发者&#xff0c;并进入…

建模分析师与算法工程师的主要区别

大家晚上好&#xff0c;我是新来的实习生小模君&#xff0c;前几天小智老师给我科普了数据挖掘的基础知识&#xff0c;颇有收获&#xff0c;于是就趁小天今天有事休假冒个泡跟大家分享一番。数据挖掘&#xff0c;英文名叫Data mining&#xff0c;一般是指从大型数据库中将隐藏的…

Flurl使用Polly实现重试Policy

❝在使用Flurl作为HttpClient向Server请求时&#xff0c;由于网络或者其它一些原因导致请求会有失败的情况&#xff0c;比如HttpStatusCode.NotFound、HttpStatusCode.ServiceUnavailable、HttpStatusCode.RequestTimeout等&#xff1b;网络上有比较多的HttpClientFactory使用P…

Linux下判断cpu物理个数、几核

自己服务器的输出 1. 查看物理CPU的个数 #cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l12. 查看逻辑CPU的个数#cat /proc/cpuinfo |grep "processor"|wc -l83. 查看CPU是几核#cat /proc/cpuinfo |grep "cores"|uniqcpu cores : 44.…

java并发框架支持锁包括,jdk1.8锁

JDK1.8有什么锁?_李广进的博客-CSDN博客2020年4月23日 18、排他锁(不包含),X锁,若事务T对数据对象A加上x锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他...jdk1.8对锁进行了哪些优化? - 知乎2020年1月8日 关注问题​写回答…

推荐15个 JavaScript 和 CSS 库

Tutorialzine的使命是让开发者与最新的Web开发发展同步。因此&#xff0c;我们每月都会精选一批最优秀的资源推荐给大家&#xff0c;相信这些资源你绝对值得拥有&#xff01;ClarifyJSClarifyJS可以让你串联一串方法&#xff0c;以任意顺序执行。通常的JavaScript方法是从左到右…

Dapr Meetup 3.22【周六】

点击蓝字关注我们Dapr&#xff08;Distributed Application Runtime &#xff0c;分布式应用运行时&#xff09;是微软新推出的&#xff0c;一个可移植的、由事件驱动的运行时&#xff0c;用于跨云和边缘构建分布式应用程序。2019年10月9日&#xff0c;正式以 MIT 协议开源。…

iPhone Development Blog系列: 如何制作服务条例窗口

iPhone Development Blog系列: 如何制作服务条例窗口 最近一直关注iPhone Development Blog上面的文章&#xff0c;学习的同时尝试通过翻译和整理同大家一起分享&#xff01; 假设你想让你的每个客户在使用iPhone应用前接受你的服务条例&#xff08;Terms of Services&#xff…

用matlab算24点小游戏,24点游戏的Matlab程序

function GUI_games24S.fh figure(units,pixels,...position,[500 500 800 200],...menubar,none,...name,24点游戏,...numbertitle,off,...resize,off);S.ti uicontrol(style,text,...units,pix,...position,[300 150 180 30],...string,24点的计算程序,fontsize,15);S.ra u…

日本老爷爷坚持17年用Excel作画,我可能用了假的Excel···

本文来源自网络说起办公软件Excel&#xff0c;不少人可能同小编一样&#xff0c;谈及色变。想想公式、表格头都大了&#xff0c;今天要介绍的这个人竟然可以用其作画&#xff0c;简直是大写的“丧心病狂”&#xff01;这位传奇人物就是堀内辰男&#xff0c;今年已经77岁了&…

腾讯二面挂了,就因为这个...

牛年跳槽季&#xff0c;惨遭开门黑&#xff0c;谨以此文纪念我的首次腾讯面试经历。经我的老师&#xff0c;微软MVP大佬推荐&#xff0c;有幸拿到了腾讯.NET Core高开面试机会&#xff0c;二面却挂在一个最常见的问题上&#xff0c;“你上家公司电商平台的TPS、QPS是多少&#…