Android网络请求框架非常多,github一搜就是一堆.我的博客就不讲这些,我就讲讲原生已经够用了.

HttpURLConnection是Android提供的一个网络请求库,个人认为,还是蛮好用的.

HttpsURLConnection是本身就继承自HttpURLConnection的类

首先是忽略证书这一块.有些请求涉及到请求证书.加载证书似乎很麻烦.(不麻烦,我不想加载)

首先需要初始化,一般我喜欢封装一个工具类,然后在静态代码块中,进行初始化

 static {try {ctx = SSLContext.getInstance("TLS");ctx.init(new KeyManager[0], new TrustManager[]{new DefaultTrustManager(null)}, new SecureRandom());ctx.getClientSessionContext().setSessionTimeout(15);ctx.getClientSessionContext().setSessionCacheSize(1000);socketFactory = ctx.getSocketFactory();} catch (Exception ignored) {}verifier = new HostnameVerifier();}
其中的new TrustManager[]{new WebUtils.DefaultTrustManager(null)}.只是继承了X509TrustManager进行使用
    private static class DefaultTrustManager implements X509TrustManager {private DefaultTrustManager(Object o) {}public X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}}
HostnameVerifier中我对忽略规则做了处理,特殊请求的url,证书还是需要的
Pattern.compile("([0-9a-fA-F]*:[0-9a-fA-F:.]*)|([\\d.]+)");

如果匹配上这条正则.则需要ssl协议

关键点在于获取Connection的时候做的处理

// new URL即可,请求方法,post还是get.Content-type,一般都是utf-8private static HttpURLConnection getConnection(URL url, String method, String ctype) throws IOException {HttpURLConnection conn = null;if ("https".equals(url.getProtocol())) {
// ssl证书管理在这里HttpsURLConnection connHttps = (HttpsURLConnection) url.openConnection();connHttps.setSSLSocketFactory(socketFactory);connHttps.setHostnameVerifier(verifier);conn = connHttps;} else {conn = (HttpURLConnection) url.openConnection();}conn.setRequestMethod(method);conn.setAllowUserInteraction(true);conn.setInstanceFollowRedirects(true);if (method.equalsIgnoreCase("post")) {conn.setDoInput(true);conn.setDoOutput(true);conn.setUseCaches(false);}// cookie也可以在这里设置
//        conn.setRequestProperty("Set-Cookie", "");conn.setRequestProperty("User-Agent","");conn.setRequestProperty("Content-Type", "");return conn;}

使用也是非常的简单

public static byte[] doGet(String url, Map<String, String> params) {HttpURLConnection conn         = null;String            responseBody = null;byte[]            bytes        = new byte[0];try {
//   这里我写了一个方法.把get请求的参数作为拼接conn = getConnection(new URL(getQueryUrl(url, params)), "GET", "*/*;charset=utf-8");conn.setReadTimeout(0);conn.setConnectTimeout(0);bytes = readInputStream(conn.getInputStream());} catch (Exception e) {e.printStackTrace();} finally {if (conn != null) {conn.disconnect();}}return bytes;}

附上完整工具类

public class WebUtils {private static final String           DEFAULT_CHARSET = "UTF-8";private static final String           METHOD_POST     = "POST";private static final String           METHOD_GET      = "GET";private static       SSLContext       ctx             = null;private static       HostnameVerifier verifier        = null;private static       SSLSocketFactory socketFactory   = null;private WebUtils() {}public static String doPostStringResponse(String url, String json) {Log.d("WebUtils", url);HttpURLConnection conn         = null;String            responseBody = null;try {conn = getConnection(new URL(url), "POST", "application/json;charset=utf-8");conn.setReadTimeout(0);conn.setConnectTimeout(0);
// post发送json数据if (!TextUtils.isEmpty(json)) {byte[] bytes = json.getBytes();conn.setRequestProperty("Content-Length", bytes.length + "");OutputStream outputStream = conn.getOutputStream();outputStream.write(bytes);outputStream.flush();outputStream.close();}byte[] bytes = readInputStream(conn.getInputStream());responseBody = new String(bytes, "utf-8");} catch (Exception e) {e.printStackTrace();} finally {if (conn != null) {conn.disconnect();}}return responseBody;}public static byte[] doGet(String url) {return doGet(url, null);}public static byte[] doGet(String url, Map<String, String> params) {HttpURLConnection conn         = null;String            responseBody = null;byte[]            bytes        = new byte[0];try {conn = getConnection(new URL(getQueryUrl(url, params)), "GET", "*/*;charset=utf-8");conn.setReadTimeout(0);conn.setConnectTimeout(0);bytes = readInputStream(conn.getInputStream());} catch (Exception e) {e.printStackTrace();} finally {if (conn != null) {conn.disconnect();}}return bytes;}private static byte[] readInputStream(InputStream inputStream) throws IOException {byte[]                buffer = new byte[1024];int                   len    = 0;ByteArrayOutputStream bos    = new ByteArrayOutputStream();while ((len = inputStream.read(buffer)) != -1) {bos.write(buffer, 0, len);}bos.close();inputStream.close();return bos.toByteArray();}private static HttpURLConnection getConnection(URL url, String method, String ctype) throws IOException {HttpURLConnection conn = null;if ("https".equals(url.getProtocol())) {HttpsURLConnection connHttps = (HttpsURLConnection) url.openConnection();connHttps.setSSLSocketFactory(socketFactory);connHttps.setHostnameVerifier(verifier);conn = connHttps;} else {conn = (HttpURLConnection) url.openConnection();}conn.setRequestMethod(method);conn.setAllowUserInteraction(true);conn.setInstanceFollowRedirects(true);
// post方法必须加上,get方法是不需要这些,否则会失败if (method.equalsIgnoreCase("post")) {conn.setDoInput(true);conn.setDoOutput(true);conn.setUseCaches(false);}// cookie也可以在这里设置
//        conn.setRequestProperty("Set-Cookie", "");conn.setRequestProperty("User-Agent", Settings.UA);conn.setRequestProperty("Content-Type", ctype);return conn;}static {try {ctx = SSLContext.getInstance("TLS");ctx.init(new KeyManager[0], new TrustManager[]{new WebUtils.DefaultTrustManager(null)}, new SecureRandom());ctx.getClientSessionContext().setSessionTimeout(15);ctx.getClientSessionContext().setSessionCacheSize(1000);socketFactory = ctx.getSocketFactory();} catch (Exception ignored) {}verifier = new HostnameVerifier();}/*** 拼接get数据** @param url    地址 * @param params get参数* @return*/private static String getQueryUrl(String url, Map<String, String> params) {StringBuilder neoUrl = new StringBuilder(url);if (params != null) {neoUrl.append("?");for (Map.Entry<String, String> stringStringEntry : params.entrySet()) {neoUrl.append(stringStringEntry.getKey()).append("=").append(stringStringEntry.getValue()).append("&");}neoUrl = new StringBuilder(neoUrl.substring(0, neoUrl.length() - 1));}return neoUrl.toString();}private static class DefaultTrustManager implements X509TrustManager {private DefaultTrustManager(Object o) {}public X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}}}

以及HostnameVerifier

public class HostnameVerifier implements javax.net.ssl.HostnameVerifier {public static final  HostnameVerifier INSTANCE             = new HostnameVerifier();private static final int              ALT_DNS_NAME         = 2;private static final int              ALT_IPA_NAME         = 7;private static final Pattern          VERIFY_AS_IP_ADDRESS = Pattern.compile("([0-9a-fA-F]*:[0-9a-fA-F:.]*)|([\\d.]+)");HostnameVerifier() {}public boolean verify(String host, SSLSession session) {try {Certificate[] certificates = session.getPeerCertificates();return this.verify(host, (X509Certificate)certificates[0]);} catch (SSLException var4) {return false;}}public boolean verify(String host, X509Certificate certificate) {return verifyAsIpAddress(host)?this.verifyIpAddress(host, certificate):this.verifyHostname(host, certificate);}private boolean verifyIpAddress(String ipAddress, X509Certificate certificate) {List<String> altNames = getSubjectAltNames(certificate, 7);int          i        = 0;for(int size = altNames.size(); i < size; ++i) {if(ipAddress.equalsIgnoreCase((String)altNames.get(i))) {return true;}}return false;}private boolean verifyHostname(String hostname, X509Certificate certificate) {hostname = hostname.toLowerCase(Locale.US);List<String> altNames = getSubjectAltNames(certificate, 2);Iterator     var4     = altNames.iterator();String altName;do {if(!var4.hasNext()) {return false;}altName = (String)var4.next();} while(!this.verifyHostname(hostname, altName));return true;}public static List<String> allSubjectAltNames(X509Certificate certificate) {List<String> altIpaNames = getSubjectAltNames(certificate, 7);List<String> altDnsNames = getSubjectAltNames(certificate, 2);List<String> result = new ArrayList(altIpaNames.size() + altDnsNames.size());result.addAll(altIpaNames);result.addAll(altDnsNames);return result;}private static List<String> getSubjectAltNames(X509Certificate certificate, int type) {ArrayList result = new ArrayList();try {Collection<?> subjectAltNames = certificate.getSubjectAlternativeNames();if(subjectAltNames == null) {return Collections.emptyList();} else {Iterator var4 = subjectAltNames.iterator();while(var4.hasNext()) {Object subjectAltName = var4.next();List<?> entry = (List)subjectAltName;if(entry != null && entry.size() >= 2) {Integer altNameType = (Integer)entry.get(0);if(altNameType != null && altNameType.intValue() == type) {String altName = (String)entry.get(1);if(altName != null) {result.add(altName);}}}}return result;}} catch (CertificateParsingException var9) {return Collections.emptyList();}}public boolean verifyHostname(String hostname, String pattern) {if(hostname != null && hostname.length() != 0 && !hostname.startsWith(".") && !hostname.endsWith("..")) {if(pattern != null && pattern.length() != 0 && !pattern.startsWith(".") && !pattern.endsWith("..")) {if(!hostname.endsWith(".")) {hostname = hostname + '.';}if(!pattern.endsWith(".")) {pattern = pattern + '.';}pattern = pattern.toLowerCase(Locale.US);if(!pattern.contains("*")) {return hostname.equals(pattern);} else if(pattern.startsWith("*.") && pattern.indexOf(42, 1) == -1) {if(hostname.length() < pattern.length()) {return false;} else if("*.".equals(pattern)) {return false;} else {String suffix = pattern.substring(1);if(!hostname.endsWith(suffix)) {return false;} else {int suffixStartIndexInHostname = hostname.length() - suffix.length();return suffixStartIndexInHostname <= 0 || hostname.lastIndexOf(46, suffixStartIndexInHostname - 1) == -1;}}} else {return false;}} else {return false;}} else {return false;}}public static boolean verifyAsIpAddress(String host) {return VERIFY_AS_IP_ADDRESS.matcher(host).matches();}
}

Android-工作遭遇-URLConnection原生请求http和https忽略证书相关推荐

  1. 解读Android 4.0 Camera原生应用程序的设计思路

    解读Android 4.0 Camera原生应用程序的设计思路 一篇很不错的文章: http://my.oschina.net/jerikc/blog/90791 1. 设置摄像头方向 2. 打开线程 ...

  2. Android工作经验三年总结。(零基础自学Android)

    开篇 两年前写过一篇 Android工作经验一年总结 之后还是不少的小伙伴加到了我的QQ分享经验,现在基本上都找到了比较满意的工作踏上了脱发之路.大概有20几个吧,都是经历和我差不多,也是愿意是吃苦和 ...

  3. Android 开发之Okhttp网络请求日志打印

    这里写自定义目录标题 Android 开发之Okhttp 网络请求日志打印 OkHTTP网络日志打印 Android 开发之Okhttp 网络请求日志打印 网络请求是开发的日常工作内容之一,网络日志打 ...

  4. Android应用程序是如何请求SurfaceFlinger服务渲染一个Surface的?

    在前面一篇文章中,我们分析了Android应用程序请求SurfaceFlinger服务创建Surface的过程.有了Surface之后,Android应用程序就可以在上面绘制自己的UI了,接着再请求S ...

  5. Android 4.2.2原生Launcher修改使之可以运行过程小结

    Android 4.2.2原生Launcher修改使之可以运行过程小结 要想让原生的Launcher代码能运行起来,主要有三个问题: 1.Launcher类编译不过的问题:com.android.co ...

  6. Android 7.0解决抓取不到https请求的问题

    Android 7.0解决抓取不到https请求的问题 参考文章: (1)Android 7.0解决抓取不到https请求的问题 (2)https://www.cnblogs.com/meitian/ ...

  7. Android复习03(Get请求访问网络[详解]、获取文章列表)

    2020年3月26日 第6周 星期四 https://ke.qq.com/webcourse/index.html#cid=989760&term_id=101085595&taid= ...

  8. Android Flow遇见Retrofit网络请求实践

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/121754941 本文出自[赵彦军的博客] 文章目录 前言 RetrofitFlow ...

  9. android调用flutter aar_Flutter原生混合开发

    混合开发简介 使用Flutter从零开始开发App是一件轻松惬意的事情,但对于一些成熟的产品来说,完全摒弃原有App的历史沉淀,全面转向Flutter是不现实的.因此使用Flutter去统一Andro ...

最新文章

  1. 全面解析 Kmeans 聚类算法(Python)
  2. redhat linux ls ls,Linux(3)RedHat7 基本命令二-ls命令詳解
  3. wxWidgets:演示笔记本notebook使用
  4. shell函数与数组(了解函数,递归函数运用,了解数组,创建基数和偶数数组,冒泡排序,调试命令)
  5. Redis--COW(Copy On Write)
  6. 在Linux上使用Nginx为Solr集群做负载均衡
  7. 计算机科学与技术博士论文,计算机科学与技术系博士学位论文答辩.PDF
  8. Excel 宏代码实现按相同值分组设置背景颜色
  9. forge插件_使用Forge插件在现有Java EE项目上启用Arquillian
  10. LeetCode LCP 34. 二叉树染色(树上DP)
  11. python的sort()和sorted()的区别_Python 3中sort()和sorted()的区别和用法,Python3
  12. JAVA实现ATM源代码及感想
  13. 回顾线性系统和非线性系统
  14. 索尼xzp升级android p,索尼XZ Premium国行正式推送安卓8.0更新!功能大升级
  15. 2008年07月《安全天下事之莫须有的敌人与看得到的威胁》、2008年08月《安全天下事之七月流火》...
  16. linux代码丢了,Linux 使用ss命令代替 netstat
  17. linux常用命令-part2
  18. 跨境必看:跨境支付问题以及热门跨境支付方式的优劣势分析!
  19. 数据库DDL数据定义语言
  20. 2016-年蓝桥杯C-(A组)赛题-网友年龄

热门文章

  1. 关于一些Excel的快捷键总结
  2. 独立样本与配对样本t检验
  3. ro服务器物品掉率修改,给冒险者们的一封致歉信 社交服务器持续优化 仙境传说手游常见BUG解答...
  4. 在联想硬盘保护系统7.6版本下 机房系统网络同传实践操作 (二)
  5. Extracting Data from XML
  6. 创建阿里云ecs实例Linux系统教程-Unirech阿里云代充
  7. 全球太阳能、风能资源空间分布数据集
  8. 云端服务器部署前端工程
  9. 湖北一考生将高考数学题上传小猿搜题事件网络舆情综合编报
  10. 显卡内存和计算机内存,显存和内存的关系和区别