From 7f661ebac732c2c794a4e7e6479245fd27ac7a5c Mon Sep 17 00:00:00 2001 From: zongfi Date: Fri, 23 Oct 2015 19:53:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E5=90=88okhttp=E5=92=8Cvolley?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + .../java/com/zongfi/zhttp/MainActivity.java | 26 +- .../com/zongfi/zhttp/network/OkHttpStack.java | 228 ++++++++++++++++-- .../zhttp/network/SelfSignSslOkHttpStack.java | 43 ---- .../com/zongfi/zhttp/network/ZHttpClient.java | 53 ++++ 5 files changed, 277 insertions(+), 75 deletions(-) delete mode 100644 app/src/main/java/com/zongfi/zhttp/network/SelfSignSslOkHttpStack.java create mode 100644 app/src/main/java/com/zongfi/zhttp/network/ZHttpClient.java diff --git a/app/build.gradle b/app/build.gradle index 87da003..7eeb2b8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.1" + useLibrary 'org.apache.http.legacy' defaultConfig { applicationId "com.zongfi.zhttp" @@ -28,4 +29,5 @@ dependencies { compile 'com.jakewharton:butterknife:7.0.1' compile 'com.squareup.okhttp:okhttp:2.5.0' compile 'com.squareup.okhttp:okhttp-urlconnection:2.5.0' + compile 'com.google.code.gson:gson:2.4' } diff --git a/app/src/main/java/com/zongfi/zhttp/MainActivity.java b/app/src/main/java/com/zongfi/zhttp/MainActivity.java index 46ae070..4b5051a 100644 --- a/app/src/main/java/com/zongfi/zhttp/MainActivity.java +++ b/app/src/main/java/com/zongfi/zhttp/MainActivity.java @@ -15,6 +15,7 @@ import com.android.volley.toolbox.Volley; import com.zongfi.zhttp.network.OkHttpStack; +import java.io.IOException; import java.util.HashMap; import javax.net.ssl.SSLSocketFactory; @@ -41,9 +42,14 @@ protected void onCreate(Bundle savedInstanceState) { fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - OkHttpStack okHttpStack = new OkHttpStack(); - RequestQueue volley = Volley.newRequestQueue(MainActivity.this, okHttpStack); - volley.start(); + try { + OkHttpStack okHttpStack = new OkHttpStack(); + okHttpStack.setCertificates(getAssets().open("srca.cer")); + RequestQueue volley = Volley.newRequestQueue(MainActivity.this, okHttpStack); + volley.start(); + } catch (IOException e) { + e.printStackTrace(); + } } }); collapsingToolbarLayout.setTitle("您看啥"); @@ -56,18 +62,6 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; } - private void requestData(){ - //TODO http://www.chinaz.com/web/2015/0731/428907.shtml - String[] hosts = {"kyfw.12306.cn"}; - int[] certRes = {R.raw.kyfw}; - String[] certPass = {"asdfqaz"}; - HashMap socketFactoryMap = new HashMap<>(hosts.length); - for(int i=0;i request, Map additionalHeaders) + throws IOException, AuthFailureError { + OkHttpClient client = mClient.clone(); + int timeoutMs = request.getTimeoutMs(); + client.setConnectTimeout(timeoutMs, TimeUnit.MILLISECONDS); + client.setReadTimeout(timeoutMs, TimeUnit.MILLISECONDS); + client.setWriteTimeout(timeoutMs, TimeUnit.MILLISECONDS); + + com.squareup.okhttp.Request.Builder okHttpRequestBuilder = + new com.squareup.okhttp.Request.Builder(); + okHttpRequestBuilder.url(request.getUrl()); + + Map headers = request.getHeaders(); + + for (final String name : headers.keySet()) { + okHttpRequestBuilder.addHeader(name, headers.get(name)); + } + + for (final String name : additionalHeaders.keySet()) { + okHttpRequestBuilder.addHeader(name, additionalHeaders.get(name)); + } + + setConnectionParametersForRequest(okHttpRequestBuilder, request); + + com.squareup.okhttp.Request okHttpRequest = okHttpRequestBuilder.build(); + Call okHttpCall = client.newCall(okHttpRequest); + Response okHttpResponse = okHttpCall.execute(); + + StatusLine responseStatus = new BasicStatusLine + ( + parseProtocol(okHttpResponse.protocol()), + okHttpResponse.code(), + okHttpResponse.message() + ); + + BasicHttpResponse response = new BasicHttpResponse(responseStatus); + response.setEntity(entityFromOkHttpResponse(okHttpResponse)); + + Headers responseHeaders = okHttpResponse.headers(); + + for (int i = 0, len = responseHeaders.size(); i < len; i++) { + final String name = responseHeaders.name(i), value = responseHeaders.value(i); + + if (name != null) { + response.addHeader(new BasicHeader(name, value)); + } + } + + return response; + } + + private static HttpEntity entityFromOkHttpResponse(Response response) throws IOException { + BasicHttpEntity entity = new BasicHttpEntity(); + ResponseBody body = response.body(); + + entity.setContent(body.byteStream()); + entity.setContentLength(body.contentLength()); + entity.setContentEncoding(response.header("Content-Encoding")); + + if (body.contentType() != null) { + entity.setContentType(body.contentType().type()); + } + return entity; + } + + @SuppressWarnings("deprecation") + private static void setConnectionParametersForRequest + (com.squareup.okhttp.Request.Builder builder, Request request) + throws IOException, AuthFailureError { + switch (request.getMethod()) { + case Request.Method.DEPRECATED_GET_OR_POST: + // Ensure backwards compatibility. + // Volley assumes a request with a null body is a GET. + byte[] postBody = request.getPostBody(); + + if (postBody != null) { + builder.post(RequestBody.create + (MediaType.parse(request.getPostBodyContentType()), postBody)); + } + break; + + case Request.Method.GET: + builder.get(); + break; + + case Request.Method.DELETE: + builder.delete(); + break; + + case Request.Method.POST: + builder.post(createRequestBody(request)); + break; + + case Request.Method.PUT: + builder.put(createRequestBody(request)); + break; + + case Request.Method.HEAD: + builder.head(); + break; + + case Request.Method.OPTIONS: + builder.method("OPTIONS", null); + break; + + case Request.Method.TRACE: + builder.method("TRACE", null); + break; + + case Request.Method.PATCH: + builder.patch(createRequestBody(request)); + break; + + default: + throw new IllegalStateException("Unknown method type."); + } + } + + private static ProtocolVersion parseProtocol(final Protocol protocol) { + switch (protocol) { + case HTTP_1_0: + return new ProtocolVersion("HTTP", 1, 0); + case HTTP_1_1: + return new ProtocolVersion("HTTP", 1, 1); + case SPDY_3: + return new ProtocolVersion("SPDY", 3, 1); + case HTTP_2: + return new ProtocolVersion("HTTP", 2, 0); + } + + throw new IllegalAccessError("Unkwown protocol"); + } + + private static RequestBody createRequestBody(Request request) throws AuthFailureError { + final byte[] body = request.getBody(); + if (body == null) return null; + + return RequestBody.create(MediaType.parse(request.getBodyContentType()), body); } } diff --git a/app/src/main/java/com/zongfi/zhttp/network/SelfSignSslOkHttpStack.java b/app/src/main/java/com/zongfi/zhttp/network/SelfSignSslOkHttpStack.java deleted file mode 100644 index bd10e96..0000000 --- a/app/src/main/java/com/zongfi/zhttp/network/SelfSignSslOkHttpStack.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.zongfi.zhttp.network; - -import com.android.volley.toolbox.HurlStack; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.OkUrlFactory; - -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.Map; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocketFactory; - -/** - * Created by ZHZEPHI on 2015/10/20. - */ -public class SelfSignSslOkHttpStack extends HurlStack { - - private OkHttpClient okHttpClient; - - private Map socketFactoryMap; - - SelfSignSslOkHttpStack(Map factoryMap){ - this(new OkHttpClient(),factoryMap); - } - - public SelfSignSslOkHttpStack(OkHttpClient okHttpClient, Map factoryMap) { - this.okHttpClient = okHttpClient; - this.socketFactoryMap = factoryMap; - } - - @Override - protected HttpURLConnection createConnection(URL url) throws IOException { - if("https".equals(url.getProtocol()) && socketFactoryMap.containsKey(url.getHost())){ - HttpsURLConnection connection = (HttpsURLConnection) new OkUrlFactory(okHttpClient).open(url); - connection.setSSLSocketFactory(socketFactoryMap.get(url.getHost())); - return connection; - }else{ - return new OkUrlFactory(okHttpClient).open(url); - } - } -} diff --git a/app/src/main/java/com/zongfi/zhttp/network/ZHttpClient.java b/app/src/main/java/com/zongfi/zhttp/network/ZHttpClient.java new file mode 100644 index 0000000..b5a78f9 --- /dev/null +++ b/app/src/main/java/com/zongfi/zhttp/network/ZHttpClient.java @@ -0,0 +1,53 @@ +package com.zongfi.zhttp.network; + +import android.content.Context; + +import com.android.volley.toolbox.Volley; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * Created by ZHZEPHI on 2015/10/23 19:10. + */ +public class ZHttpClient { + + private static ZHttpClient mInstance; + private OkHttpStack okHttpStack; + Context context; + + private ZHttpClient(Context context){ + this.context = context; + okHttpStack = new OkHttpStack(); + try { + okHttpStack.setCertificates(context.getAssets().open("srca.cer")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 获取网络请求实例 + * @return + */ + public static ZHttpClient getInstance(Context context) { + if (mInstance == null) { + synchronized (ZHttpClient.class) { + if (mInstance == null) { + mInstance = new ZHttpClient(context); + } + } + } + return mInstance; + } + + public void exec(String url){ + try { + okHttpStack.createConnection(new URL(url)); + Volley.newRequestQueue(context,okHttpStack); + } catch (IOException e) { + e.printStackTrace(); + } + } +}