作为一个web开发人员,对Http 请求,并不陌生。有时候,我们请求的时候,需要使用代码实现,一般情况,我们使用Apache Jakarta Common 下的子项目.的HttpClient.

可是我发现,在开发过成,很多情况,我们使用的功能,并不需要,想象中的需要HttpClient 的很多特性。而且,需要引用jar 。这边我们使用Java jdk自带的HttpsURLConnection.

而且,这个可以迁移到android项目封装成一个HttpUtils 方法。代码如下:

package com.xuanyuan.utils.http;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map; import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; /**
* HttpUtils帮助类
* User: PunkLin林克澎
* Email: lentr@sina.cn
* Date: 2017-04-04
*/
public class HttpUtils { private static Charset charset=Charset.defaultCharset();
private static final String TAG = "HttpUtils";
//链接超时
private static final int mReadTimeOut = 1000 * 10; // 10秒
//链接超时
private static final int mConnectTimeOut = 1000 * 5; // 5秒
private static final String CHAR_SET = charset.displayName(); private static final int mRetry = 2; // 默认尝试访问次数 /**
* 处理访问字符串处理
* @param params
* @return
* @throws UnsupportedEncodingException
*/
private static String buildParams(Map<String,? extends Object> params) throws UnsupportedEncodingException{
if(params ==null || params.isEmpty()){
return null;
}
StringBuilder builder = new StringBuilder();
for (Map.Entry<String, ? extends Object> entry : params.entrySet()) {
if (entry.getKey() != null && entry.getValue() != null)
builder.append(entry.getKey().trim()).append("=")
.append(URLEncoder.encode(entry.getValue().toString(), CHAR_SET)).append("&");
}
if(builder.charAt(builder.length()-1)=='&'){
builder.deleteCharAt(builder.length()-1);
}
return builder.toString();
} /**
* 无参数的Get访问
* @param url
* @return
* @throws Exception
*/
public static String get(String url) throws Exception {
return get(url, null);
} /**
* 有参数的Get 访问
* @param url
* @param params
* @return
* @throws Exception
*/
public static String get(String url, Map<String, ? extends Object> params) throws Exception {
return get(url, params, null);
} /**
* 含有报文头的Get请求
* @param url
* @param params
* @param headers
* @return
* @throws Exception
*/
public static String get(String url, Map<String, ? extends Object> params, Map<String, String> headers) throws Exception {
if (url == null || url.trim().length() == 0) {
throw new Exception(TAG + ": url is null or empty!");
} if (params != null && params.size() > 0) {
if (!url.contains("?")) {
url += "?";
}
if (url.charAt(url.length() - 1) != '?') {
url += "&";
}
url += buildParams(params);
} return tryToGet(url, headers);
} private static String tryToGet(String url,Map<String,String> headers) throws Exception{
int tryTime = 0;
Exception ex = null;
while (tryTime < mRetry) {
try {
return doGet(url, headers);
} catch (Exception e) {
if (e != null)
ex = e;
tryTime++;
}
}
if (ex != null)
throw ex;
else
throw new Exception("未知网络错误 ");
} /**
* Get 请求实现方法 核心
* @param strUrl
* @param headers
* @return
* @throws Exception
*/
private static String doGet(String strUrl, Map<String, String> headers) throws Exception {
HttpURLConnection connection = null;
InputStream stream = null;
try { connection = getConnection(strUrl);
configConnection(connection);
if (headers != null && headers.size() > 0) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
} connection.setInstanceFollowRedirects(true);
connection.connect(); stream = connection.getInputStream();
ByteArrayOutputStream obs = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
for (int len = 0; (len = stream.read(buffer)) > 0;) {
obs.write(buffer, 0, len);
}
obs.flush();
obs.close();
stream.close(); return new String(obs.toByteArray());
} finally {
if (connection != null) {
connection.disconnect();
}
if (stream != null) {
stream.close();
}
}
} /**
* Post 请求,无参数的请求
* @param url
* @return
* @throws Exception
*/
public static String post(String url) throws Exception {
return post(url, null);
} /**
* Post 请求,带参数的请求。
* @param url
* @param params
* @return
* @throws Exception
*/
public static String post(String url, Map<String, ? extends Object> params) throws Exception {
return post(url, params, null);
} /**
* Post 请求,带参数的请求,请求报文的
* @param url
* @param params
* @return
* @throws Exception
*/
public static String post(String url, Map<String, ? extends Object> params, Map<String, String> headers)
throws Exception {
if (url == null || url.trim().length() == 0) {
throw new Exception(TAG + ":url is null or empty!");
} if (params != null && params.size() > 0) {
return tryToPost(url, buildParams(params), headers);
} else {
return tryToPost(url, null, headers);
}
} public static String post(String url, String content, Map<String, String> headers) throws Exception {
return tryToPost(url, content, headers);
} private static String tryToPost(String url, String postContent, Map<String, String> headers) throws Exception {
int tryTime = 0;
Exception ex = null;
while (tryTime < mRetry) {
try {
return doPost(url, postContent, headers);
} catch (Exception e) {
if (e != null)
ex = e;
tryTime++;
}
}
if (ex != null)
throw ex;
else
throw new Exception("未知网络错误 ");
} private static String doPost(String strUrl, String postContent, Map<String, String> headers) throws Exception {
HttpURLConnection connection = null;
InputStream stream = null;
try {
connection = getConnection(strUrl);
configConnection(connection);
if (headers != null && headers.size() > 0) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
}
connection.setRequestMethod("POST");
connection.setDoOutput(true); if (null != postContent && !"".equals(postContent)) {
DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
dos.write(postContent.getBytes(CHAR_SET));
dos.flush();
dos.close();
}
stream = connection.getInputStream();
ByteArrayOutputStream obs = new ByteArrayOutputStream(); byte[] buffer = new byte[1024];
for (int len = 0; (len = stream.read(buffer)) > 0;) {
obs.write(buffer, 0, len);
}
obs.flush();
obs.close();
return new String(obs.toByteArray());
} finally {
if (connection != null) {
connection.disconnect();
}
if (stream != null) {
stream.close();
}
}
} private static void configConnection(HttpURLConnection connection){
if(connection==null){
return;
} connection.setReadTimeout(mReadTimeOut);
connection.setConnectTimeout(mConnectTimeOut);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
} /**
* 根据输入的请求地址判断使用https 还是使用http 获取不同的HttpURLConnection.
* @param strUrl
* @return
* @throws Exception
*/
private static HttpURLConnection getConnection(String strUrl) throws Exception {
if(strUrl == null){
return null;
}
if(strUrl.toLowerCase().startsWith("https")){
return getHttpsConnection(strUrl);
}else{
return getHttpConnection(strUrl);
}
} //获取HTTP
private static HttpURLConnection getHttpConnection(String urlStr) throws Exception {
URL url =new URL(urlStr);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
return conn;
} private static HttpURLConnection getHttpsConnection(String urlStr) throws Exception {
URL url =new URL(urlStr);
HttpsURLConnection conn=(HttpsURLConnection) url.openConnection();
conn.setHostnameVerifier(hnv);
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
if(sslContext != null){
TrustManager[] tm={xtm};
sslContext.init(null, tm, null);
SSLSocketFactory ssf =sslContext.getSocketFactory();
conn.setSSLSocketFactory(ssf);
} return conn;
} private static X509TrustManager xtm = new X509TrustManager() { @Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
} @Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
} @Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}; /**
* 用于主机名验证的基接口
*/
private static HostnameVerifier hnv = new HostnameVerifier() {
//验证主机名和服务器验证方案的匹配是可接受的。 可以接受返回true
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
}

这样,少了很多jar的引用。并且功能实现了 Https.

HttpUtils 封装类的更多相关文章

  1. HttpUtil 【判断网络连接的封装类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 该封装类主要包括以下功能: 判断是否有网络连接.判断是否有可用的网络连接: 判断是否是3G网络.判断mobile网络是否可用: 判断 ...

  2. c#生成静态html文件,封装类

    由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设 ...

  3. 自动创建WIN32下多级子目录的C++封装类

            这是 WIN32 自动创建多级子目录的 C++ 封装类,用法简单.         封装没有采用类的静态函数方式,而是在构造函数里面直接完成工作.没什么具体的原因,只是当时做成这样了, ...

  4. StackExchange.Redis 访问封装类

    最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或 ...

  5. StackExchange.Redis通用封装类分享(转)

    阅读目录 ConnectionMultiplexer 封装 RedisHelper 通用操作类封 String类型的封装 List类型的封装 Hash类型的封装 SortedSet 类型的封装 key ...

  6. 【MongoDB】 基于C#官方驱动2.2版的封装类

    一.前言 最近项目中要用到MongoDB,因此实现做了不少的调研.发现网上很多现有关于MongoDB C#官方驱动的调用方法都是基于1.8版本的,已经不是用了最新的2.2版本.因此我在基于C#官方驱动 ...

  7. 小心Java中封装类的值比较

    一般我们使用数值时,都是使用基本类型,如int.long等,但如果你喜欢使用Integer.Long的包装类,那有一点可就得注意了.先来看下这段代码: /** * * @author trytocat ...

  8. StackExchange.Redis通用封装类分享

    前两天朋友问我,有没有使用过StackExchange.Redis,问我要个封装类,由于之前都是使用ServiceStack.Redis,由于ServiceStack.Redis v4版本后是收费版的 ...

  9. Java的String.valueOf 转换 与、空串+类型变量转换与封装类(Integer)的toString方式转换比较。

    1.空串+类型变量方式转换 int i=20; String s=""+i; 这种方式实际上经过了两个步骤,首先进行了i.ToString()把 i 转换为 字符串,然后再进行加法 ...

随机推荐

  1. C# Winform 使用Application.Exit重新启动应用程序example

    Application.Exit会在所有前台线程退出后,退出应用, Environment.Exit则立即终止进程,相比之下Environment.Exit更狠些 private static voi ...

  2. 7个常见Javascript框架介绍

    设计开发中的“框架”指一套包含工具.函数库.约定,以及尝试从常用任务中抽象出可以复用的通用模块,目标是使设计师和开发人员把重点放在任务项目所特有的方面,避免重复开发.通俗的讲,框架就是最常用的java ...

  3. BlockingCollection 集合随记

    BlockingCollection 集合是一个并发安全的集合,而且设计用来实现类似于消息队列的功能,生产者.消费者模式. static void Main(string[] args) { Bloc ...

  4. c#获取pdf文件页数

    引用命名空间:using iTextSharp.text.pdf; string filePath = Server.MapPath("/upload/123.pdf"); //文 ...

  5. 在IIS上部署Asp.Net Core 2.2.0

    1. .NET Core与Windows环境 Asp.Net Core 2.2.0 Windows 10 2. 先决条件   下载并安装.Net Core Hosting Bundle. 3. 部署过 ...

  6. 造个轮子之基于 Netty 实现自己的 RPC 框架

    原文地址: haifeiWu和他朋友们的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢! 服务端开发都会或多或少的涉及到 RPC 的使用,当然如果止步于会用,对 ...

  7. OOM AutoMapper的简单实用

    OOM  AutoMapper的简单实用 一.前言: OOM顾名思义,Object-Object-Mapping实体间相互转换,AutoMapper也是个老生常谈了,其意义在于帮助你无需手动的转换简单 ...

  8. ORA-01722: 无效数字的解决方法

    Select Count(t.Wip_No) As Consignvendnewcreateno_Num From   Apps.View_Scm_Wip_Po t Where  1 = 1 And  ...

  9. 【Selenium专题】WebDriver启动firefox浏览器

    firefox浏览器不需要下载驱动,原生支持,以下是代码运行环境,firefox启动封装在方法startFirefox()中 import org.openqa.selenium.WebDriver; ...

  10. day03.2-内置函数的使用

    1. 取绝对值函数,abs() res = abs(-1) print(res) """ 运行结果:1 结果分析:计算-1的绝对值 """ ...