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

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

  1. java请求header_java中处理header请求以及跟cookie相关的一些细节

    上面的请求头中,我们可以看到cookie不同变量之间是用分号间隔的,没有包含phpsessionid.在某些处理http协议的java包中,可以看到对header的生成提供了专门的方法,类似于addH ...

  2. Java 技术篇 - ServerSocket接收http的url请求中包含中文的处理方法,URLDecode与URLEncode,url解码与编码

    效果图: 正常接收到中文的请求是这个样子的:%E6%AC%A2%E8%BF%8E%E6%9D%A5%E5%88%B0%E5%B0%8F%E8%93%9D%E6%9E%A3%E7%9A%84%E5%8D ...

  3. Java 技术篇 - 启动web服务接收浏览器请求并响应实例演示,解决socket响应浏览器显示中文乱码问题,web服务response响应设置浏览器显示字体方法

    先看下效果图: 我通过 127.0.0.1:10010 访问我启用服务的效果图. 后台接收到的前台请求如下: GET / HTTP/1.1 Host: 127.0.0.1:10010 Connecti ...

  4. java同名过滤器_Gateway Redis令牌桶请求限流过滤器

    spring cloud gateway默认基于redis令牌桶算法进行微服务的限流保护,采用RateLimter限流算法来实现. 1.引入依赖包 org.springframework.cloud ...

  5. java 过滤掉相同请求_java并发访问重复请求过滤问题

    问题描述 前段时间遇到个问题,自己内部系统调用出现重复请求导致数据混乱. 发生条件:接受到一个请求,该请求没有执行完成又接受到相同请求,导致数据错误(如果是前一个请求执行完成,马上又接受相同请求不会有 ...

  6. java 表单请求_java模拟表单请求

    表单普通字段 public class FormFieldKeyValuePair { private static final long serialVersionUID = 1L; // The ...

  7. java 请求响应_java http接口请求响应 request response

    接口类: 1 package org.sunshine.dcda.epg.wechat.controller.niao; 2 3 import javax.servlet.http.HttpServl ...

  8. 一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗...

    一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗 答案是:是,一个http请求,就是一个线程. https://blog.csdn.net/elvis_lfc/ar ...

  9. java发送http的get、post请求

    Http请求类 package wzh.Http;import java.io.BufferedReader; import java.io.IOException; import java.io.I ...

最新文章

  1. 刚刚!美国官宣100000名 IT 人失业,感觉很慌 !
  2. ubuntu 远程访问mysql_Ubuntu下远程访问MySQL数据库
  3. spring in action 读书笔记
  4. 关于CTeX的几个大坑
  5. 计算机应用乘法,计算机系统原理(十) 二进制整数的乘法运算和除法运算
  6. [Grid Layout] Place grid items on a grid using grid-column and grid-row
  7. java实现手机开关机_Android 系统重启与关机:Java 代码实现
  8. 数据结构-线性表之带头结点的双向循环链表
  9. WebService的两种用户验证方式
  10. windos 服务怎么写_周岁邀请函怎么写
  11. python类方法和实例方法的区别_python中的类方法,实例方法和静态方法的区别
  12. 虚拟局域网+思科交换机基础配置学习有图简单易懂.
  13. 墨画子卿第一章第9节:指教
  14. java青蛙跳井_数学运算归纳
  15. 计算机桌面时间设置,电脑时间校准,教您怎么校正电脑时间
  16. HEIC图片如何批量转换成jpg格式
  17. 使用Overleaf写作是参考文献引用没按顺序
  18. PD 关于tso 分配源代码分析
  19. leetcode刷题第21天——1763,117,572
  20. 【观察】“种树植心”:不止于眼下,更关乎未来

热门文章

  1. GraphQL 的前世今生
  2. ObjectTive C语言语法,[译]理解 Objective-C 运行时(下篇)
  3. 【数据库原理及应用】经典题库附答案(14章全)——第四章:关系系统及其优化
  4. C#趣味程序---车牌号判断
  5. Android之解决TabLayout里面每个Tab项的间距和修改指示线的长度(非反射)和修改选中字体大小
  6. Android之解决ViewPager2+PhotoView滑动图片花屏问题
  7. Android之华为meta10 pro安卓8.0绑定服务(bindService)失败解决办法
  8. Android之关于电话录音原理,目前的方法还是只能录MIC
  9. C++ 语法都不会怎么写代码? 03
  10. 《零基础看得懂的C语言入门教程 》——(五)C语言的变量、常量及运算