1.HttpClient和httpurlconnection介绍
HttpClient是Apache开源组织提供的一个Http客户端,HttpClient封装了Session、Cookie等细节问题的处理。简单来讲,HttpClient就是一个加强版的HttpURLConnection,HttpURLConnection能够作的事情 HttpClient所有能够作;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP链接。因为HttpClient API较多,体型较大升级和维护起来较为繁琐,Android团队在API 23中移除了对HttpClient的支持。
2.HttpURLConnection是java的标准类,没有作封装,用起来比较原始java
使用httpurlconnection实现get,post请求:json
get请求传参:参数跟在url后api
post请求传参:将参数放入输出流中app
public static String httpUrlConnectionGet(参数) throws Throwable { String result = null; try { trustAllHosts(); URL serverUrl = new URL(params); HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-type", "application/json"); conn.setConnectTimeout(connectTimeout); conn.setInstanceFollowRedirects(false); conn.connect(); if (conn.getResponseCode() == 200) { result = getReturn(conn); } else { logger.error("Return to Data is wrong"); } logger.info("httpUrlConnectionget method end"); } catch (IOException e) { logger.error(e.getMessage()); } catch (Exception e) { logger.error(e.getMessage()); } return result; }
其中trustAllHosts();方法是跳过https证书,能够进行无证书访问dom
private static void trustAllHosts() { TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[] {}; } @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } } }; // Install the all-trusting trust manager try { SSLContext sc = SSLContext.getInstance("SSL", "SunJSSE"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(NoopHostnameVerifier.INSTANCE); } catch (Exception e) { e.printStackTrace(); } }
httpURLconnection post方法请求apiide
public static String httpUrlConnectionPost(String params, String requestUrl, String profilesActive) throws Throwable { String result = null; try { if ("alpha".equals(profilesActive)) { trustAllHosts(); } URL serverUrl = new URL(requestUrl); logger.info(serverUrl.toString()); logger.info("httpUrlConnectionPost method start"); HttpsURLConnection conn = (HttpsURLConnection) serverUrl.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setConnectTimeout(connectTimeout); conn.setInstanceFollowRedirects(false); conn.setDoOutput(true); conn.connect(); DataOutputStream out = new DataOutputStream(conn.getOutputStream()); logger.info(params); out.writeBytes(params); out.flush(); out.close(); if (conn.getResponseCode() == 200) { result = getReturn(conn); } else { logger.error("Return to Data is wrong"); } Integer code = conn.getResponseCode(); logger.info(code.toString()); result = getReturn(conn); logger.info("httpUrlConnectionPost method end"); } catch (IOException e) { logger.error(e.getMessage()); } catch (Exception e) { logger.error(e.getMessage()); } return result; }
因为httpurlconnection是以输入输出流的形式进行数据传输,因此接到返回值须要转换成Sting字符串,使用obectMapper进行解析获得map,进而获得想要的数据。工具
public static String getReturn(HttpURLConnection connection) throws IOException { StringBuffer buffer = new StringBuffer(); try (InputStream inputStream = connection.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) { String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } String result = buffer.toString(); return result; } }
json解析:oop
public class JsonToMapUtil { public static Map<String, Object> getMap(String result) throws Exception{ ObjectMapper mapper = new ObjectMapper(); Map<String, Object> mapperMap = new HashMap<String, Object>(); Map<String, Object> data = mapper.readValue(result, mapperMap.getClass()); return data; } }
https证书:post
http+ssl:证书一共分为两种,一种是域名申请证书,还有一种是IP申请证书url
有一种状况是请求https的api,使用ip仍是域名的url去申请是由证书属于哪一种所决定的,若是是ip申请证书而且没有域名,那么就算是本身本地配置hosts域名,也是行不通的。可是大部分正式环境都是带有域名的
注意:
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
中的类型若是错误则会出现传参失败的状况。
小细节:
若是把此类定义为一个工具类,那么方法都要用static修饰
基础:每一个线程都有本身的线程栈,栈与线程同时建立,每个虚拟机线程都有本身的程序计数器PC,在任什么时候刻,一个虚拟机线程只会执行一个方法的代码,这个方法称为该线程的当前方法,若是这个方法不是native的,程序计数器就保存虚拟机正在执行的字节码指令的地址。线程调用方法的时候会建立栈帧,用于保存局部变量表和操做数栈以及指向该类常量池的引用
静态方法虽然是同一个方法,可是不一样线程在调用,程序计数器的值是不同的,操做这两个线程不会相互影响(假设不存在访问共享变量的状况)
1.保证不依靠其余类、属性、方法等
2.不须要考虑方法同步
3. 若是使用单例类,须要考虑线程同步的状况,这是工具类不使用单例的缘由
这里还有一点须要补充:在写工具类时,最好是将其构造方法私有化,避免意外的初始化类,作无心义的工做
其中单例和多例概念:
http://www.javashuo.com/article/p-eafsogek-do.html
这篇文章介绍的很清晰