近期做项目中,须要把消息通过中间件的形式通过http请求的方式推送给第三方,因此用到了http协议,小编花费了一个多小时。对于http协议中的post和get请求,封装了一个工具类。以下与大家分享一下。

有不好的地方请多多不吝赐教。

/**
* @FileName: HttpTest.java
* @Package:com.io
* @Description: TODO
* @author: LUCKY
* @date:2016年1月6日 下午3:49:28
* @version V1.0
*/
package com.io; import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; import com.alibaba.common.lang.StringUtil; /**
* @ClassName: HttpTest
* @Description: 自己開始封装的HTTP连接工具,http连接传递的參数封装到一个对象里面,
* http中get请求时,是把參数拼接到url后面的,而post请求直接输出就可以
* @author: LUCKY
* @date:2016年1月6日 下午3:49:28
*/
public class HttpTest { private static final String METHOD_POST = "POST";
private static final String METHOD_GET = "GET";
private static final String DEFAULT_CHARSET = "UTF-8";
private static final String HTTPS = "https";
private static final String TLS = "tls";
private static final String CTYPE = "application/x-www-form-urlencoded;charset="
+ DEFAULT_CHARSET; public static void main(String[] args) throws Exception {
Map<String, String> param = new HashMap<String, String>();
param.put("body", String.valueOf(System.currentTimeMillis()));
param.put("tag", "撒点粉");
String string = doGet(
" http://localhost/receive.do", param,
3000, 3000);
String aa = doPost(
" http://localhost/receive.do", param,
3000, 3000);
System.out.println(string.length());
System.out.println(string);
} /**
* @throws Exception
* @Title: doPost
* @Description: doPost发送请求操作
* @param @param url
* @param @param params
* @param @param readTimeOut
* @param @param connectTimeOut
* @param @return
* @return String
* @throws
*/
public static String doPost(String url, Map<String, String> params,
int readTimeOut, int connectTimeOut) throws Exception {
HttpURLConnection connection = null;
OutputStream out = null;
String result = null;
try {
connection = getConnection(new URL(url), readTimeOut,
connectTimeOut, METHOD_POST, CTYPE, null);
byte[] content = new byte[0];
String param = getUrl(params, DEFAULT_CHARSET);
if (StringUtil.isNotEmpty(param)) {
content = param.getBytes(DEFAULT_CHARSET);
}
out = connection.getOutputStream();
// post传送消息内容
out.write(content);
// 接受的返回值通过buffer来接受 result = responseAsString(connection);
} catch (IOException e) {
e.printStackTrace();
throw e;
} finally {
if (connection != null) {
connection.disconnect();
}
} return result; } /**
* @Title: doGet
* @Description: doGet发送消息请求
* @param @param url
* @param @param params
* @param @param readTimeOut
* @param @param connectTimeOut
* @param @return
* @return String
* @throws
*/
public static String doGet(String url, Map<String, String> params,
int readTimeOut, int connectTimeOut) { HttpURLConnection connection = null;
String result=null;
try {
String query = getUrl(params, DEFAULT_CHARSET);
connection = getConnection(new URL(buildUrl(url, query)),
readTimeOut, connectTimeOut, METHOD_GET, CTYPE, null);
result=responseAsString(connection);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
return result;
} // 把doGet和doPost请求最后的接受參数再次的抽取出来
private static String responseAsString(HttpURLConnection connection) {
StringBuffer buffer = new StringBuffer();
InputStreamReader reader = null;
OutputStream out = null;
try {
// 假设返回成功
if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
reader = new InputStreamReader(connection.getInputStream());
char[] ch = new char[1024];
int x = 0;
while ((x = reader.read(ch)) != -1) {
buffer.append(ch, 0, x);
}
} } catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
} return buffer.toString();
} // 须要再写一个getConnection的方法,把doPost和doGet的connection都抽取出来
private static HttpURLConnection getConnection(URL url, int readTimeOut,
int connectTimeOut, String method, String ctype,
Map<String, String> headMap) throws Exception {
HttpURLConnection connection = null;
if (url == null) {
return null;
}
if (HTTPS.equals(url.getProtocol())) {
SSLContext ctx = null;
try {
ctx = SSLContext.getInstance(TLS);
ctx.init(new KeyManager[0],
new TrustManager[] { new DefaultTrustManager() },
new SecureRandom());
} catch (Exception e) {
throw new IOException(e);
}
HttpsURLConnection connHttps = (HttpsURLConnection) url
.openConnection();
connHttps.setSSLSocketFactory(ctx.getSocketFactory());
connHttps.setHostnameVerifier(new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) {
return true;
}
});
connection = connHttps;
} else {
connection = (HttpURLConnection) url.openConnection();
} connection.setReadTimeout(readTimeOut);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod(method);
connection.setConnectTimeout(connectTimeOut);
connection.setRequestProperty("Accept",
"text/xml,text/javascript,text/html");
connection.setRequestProperty("User-Agent", "top-sdk-java");
connection.setRequestProperty("Content-Type", ctype);
// 遍历设置headMap
if (null != headMap) {
Set<Entry<String, String>> entries = headMap.entrySet();
for (Map.Entry<String, String> entry : entries) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
} return connection;
} /**
* @Title: getUrl
* @Description: doGet发送请求时拼接的URL
* @param @param params
* @param @param charset
* @param @return
* @param @throws UnsupportedEncodingException
* @return String
* @throws
*/
public static String getUrl(Map<String, String> params, String charset)
throws UnsupportedEncodingException {
StringBuffer buffer = new StringBuffer("?");
if (params == null && params.isEmpty()) {
return null;
}
// 否则的话,開始拼接须要传递的值。也就是URL?AA==BB&CC==EE这种相似的连接值
Set<Entry<String, String>> entries = params.entrySet();
for (Entry<String, String> entry : entries) {
String name = entry.getKey();
String value = entry.getValue();
// 还须要进行一次推断是否为空,一定要慎重
if (StringUtil.isNotEmpty(name) && StringUtil.isNotEmpty(value)) {
// 假设不为空的话。開始进行连接操作
buffer.append("&").append(name).append("=")
.append(URLEncoder.encode(value, charset));
} }
return buffer.toString().substring(0, buffer.toString().length() - 1); } /**
* @Title: buildUrl
* @Description: 拼接url地址操作
* @param @param url
* @param @param query
* @param @return
* @return String
* @throws
*/
private static String buildUrl(String url, String query) {
if (query == null && query.isEmpty()) {
return url;
}
if (url.endsWith("?")) {
url = url + query;
} else {
url = url + "? " + query;
} return url;
} private static class DefaultTrustManager implements X509TrustManager { public X509Certificate[] getAcceptedIssuers() {
return null;
} public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
} public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
} }

很多其它有关http协议的内容,请參考:Http协议具体解释

Http协议中的Content-Type

Java中发送http的get、post请求的更多相关文章

  1. JAVA中发送电子邮件的方法

    JAVA中发送邮件的方法不复杂,使用sun的JavaMail的架包就可以实现.  一.下载JavaMail的架包,并导入项目中,如下: 二.附上代码例子,如下: 1.在main函数中对各项参数进行赋值 ...

  2. Java中解决前端的跨域请求问题

    在最近的分布式项目中,由于前端需要向后台请求数据,但不是同一个域名的,常用的ajax方法并不能成功调用,索然后台有数据返回,但是并不能被前端正常解析. 于是便查询知道了后台返回的数据格式的问题.不能用 ...

  3. 在Java中发送http的post请求,设置请求参数等等

    前几天做了一个定时导入数据的接口,需要发送http请求,第一次做这种的需求,特地记一下子, 导包 import java.text.SimpleDateFormat;import java.util. ...

  4. java中发送http请求的方法

    package org.jeecgframework.test.demo; import java.io.BufferedReader; import java.io.FileOutputStream ...

  5. java代码发送JSON格式的httpPOST请求

    package com.test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOE ...

  6. (转)java代码发送JSON格式的httpPOST请求

    import Java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import j ...

  7. spring MVC 管理HttpClient---实现在java中直接向Controller发送请求

    在spring MVC中,大多数时候是由客户端的页面通过ajax等方式向controller发送请求,但有时候需要在java代码中直接向controller发送请求,这时可以使用HttpCilent实 ...

  8. JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求

    JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求 哇,一看标题怎么这么长啊,其实意思很简单,哥讨厌用HTTP Client做POST与GET提交 觉得那个毕竟是别人写 ...

  9. java中模拟http(https)请求的工具类

    在java中,特别是java web中,我们经常需要碰到的一个场景是我们需要从服务端去发送http请求,获取到数据,而不是直接从浏览器输入请求网址获得相应.比如我们想访问微信接口,获取其返回信息. 在 ...

随机推荐

  1. RelativeLayout.addRule()方法

    RelativeLayout.addRule()方法 通过LayoutParams的 addRule方法来额外的添加别的规则了,android.widget.RelativeLayout.Layout ...

  2. 3ds Max制作厨房贴图和纹理实例

    来源:CG游 使用软件:3ds Max 软件下载:www.xy3dsmax.com/xiazai.html 大家好,欢迎大家来阅读这个教程.这个教程是讲解我前不久制作的一个场景效果图.因为场景已经制作 ...

  3. sass的用法小结(三)

    5. 混合器; 如果你的整个网站中有几处小小的样式类似(例如一致的颜色和字体),那么使用变量来统一处理这种情况是非常不错的选择.但是当你的样式变得越来越复杂,你需要大段大段的重用样式的代码,独立的变量 ...

  4. [细节版]Let'sEncrypt 免费通配符/泛域名SSL证书添加使用教程

    参考网址:https://lnmp.org/faq/letsencrypt-wildcard-ssl.html 使用的dns服务商:阿里云 , 更多服务商地址可见参考网址. 遇见的问题一. [Sat ...

  5. python学习笔记第三章

    1.列表是由一系列特定顺序排列得元素组成,在python中用([])组成,列表得索引是从0开始,不是1 xu=['a','b',''c] print(xu) 访问列表的元素第一个元素 xu=['a', ...

  6. CF451E Devu and Flowers (组合数学+容斥)

    题目大意:给你$n$个箱子,每个箱子里有$a_{i}$个花,你最多取$s$个花,求所有取花的方案,$n<=20$,$s<=1e14$,$a_{i}<=1e12$ 容斥入门题目 把取花 ...

  7. GenIcam标准(一)

    1.概述 如今的数码摄相机包含了很多的功能,而不仅仅是采集图像.对于机器视觉相机来说,处理图像并把结果附加到图像数据流上,控制附加的硬件,代替应用程序作实时的处理等都是很平常的事情.这也导致了相机的编 ...

  8. jquery IE7 下报错:SCRIPT257: 由于出现错误 80020101 而导致此项操作无法完成

        非IE(内核)浏览器运行正常,在IE中运行异常,一般考虑为js中多了符号.     常见的有:         1.上面的html注释"<!-- -->",这种 ...

  9. 空暇时候思考之const

    对于多数人来说那些const的使用方法比方修饰返回值和修饰參数都应该是十分好理解的下来我要讨论 对于C语言中 #include <stdio.h> void main() { const ...

  10. 使用caffemodel模型(由mnist训练)测试单张手写数字样本

    caffe中训练和测试mnist数据集都是批处理,可以反馈识别率,但是看不到单张样本的识别效果,这里使用windows自带的画图工具手写制作0~9的测试数字,然后使用caffemodel模型识别. 1 ...