您的位置:首页 > 理论基础 > 计算机网络

OkHttp

2016-01-25 14:46 357 查看
import java.io.File;

import java.io.IOException;

import java.net.CookieManager;

import java.net.CookiePolicy;

import java.net.FileNameMap;

import java.net.URLConnection;

import java.util.Map;

import java.util.Set;

import java.util.concurrent.TimeUnit;

import android.annotation.SuppressLint;

import android.os.Handler;

import android.os.Looper;

import com.google.gson.Gson;

import com.squareup.okhttp.Call;

import com.squareup.okhttp.Callback;

import com.squareup.okhttp.FormEncodingBuilder;

import com.squareup.okhttp.Headers;

import com.squareup.okhttp.MediaType;

import com.squareup.okhttp.MultipartBuilder;

import com.squareup.okhttp.OkHttpClient;

import com.squareup.okhttp.Request;

import com.squareup.okhttp.RequestBody;

import com.squareup.okhttp.Response;

@SuppressLint("NewApi")

public class OkHttpClientManager {

private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

private static OkHttpClientManager mInstance;

private OkHttpClient mOkHttpClient;

private Handler mDelivery;

private Gson mGson;

private static final String TAG = "OkHttpClientManager";

private OkHttpClientManager() {

mOkHttpClient = new OkHttpClient();

mOkHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);

mOkHttpClient.setReadTimeout(10, TimeUnit.SECONDS);

mOkHttpClient.setWriteTimeout(10, TimeUnit.SECONDS);

// cookie enabled

mOkHttpClient.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));

mDelivery = new Handler(Looper.getMainLooper());

mGson = new Gson();

}

public static OkHttpClientManager getInstance() {

if (mInstance == null) {

synchronized (OkHttpClientManager.class) {

if (mInstance == null) {

mInstance = new OkHttpClientManager();

}

}

}

return mInstance;

}

/**

* 同步的Get请求

*

* @param url

* @return Response

*/

private Response _getAsyn(String url) throws IOException {

final Request request = new Request.Builder().url(url).build();

Call call = mOkHttpClient.newCall(request);

Response execute = call.execute();

return execute;

}

/**

* 同步的Get请求

*

* @param url

* @return 字符串

*/

private String _getAsString(String url) throws IOException {

Response execute = _getAsyn(url);

return execute.body().string();

}

/**

* 异步的get请求

*

* @param url

* @param callback

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

private void _getAsyn(String url, final ResultCallback callback) {

final Request request = new Request.Builder().url(url).build();

deliveryResult(callback, request);

}

/**

* 同步的Post请求

*

* @param url

* @param params

* post的参数

* @return

*/

private Response _post(String url, Param... params) throws IOException {

Request request = buildPostRequest(url, params);

Response response = mOkHttpClient.newCall(request).execute();

return response;

}

/**

* 同步的Post请求

*

* @param url

* @param params

* post的参数

* @return 字符串

*/

private String _postAsString(String url, Param... params) throws IOException {

Response response = _post(url, params);

return response.body().string();

}

/**

* 同步的Post请求

*

* @param url

* @param params

* post的参数

* @return

*/

private Response _post(String url, String jsonParam) throws IOException {

Request request = buildPostRequest(url, jsonParam);

Response response = mOkHttpClient.newCall(request).execute();

return response;

}

/**

* 同步的Post请求

*

* @param url

* @param params

* post的参数

* @return 字符串

*/

private String _postAsString(String url, String jsonParam) throws IOException {

Response response = _post(url, jsonParam);

return response.body().string();

}

/**

* 异步的post请求

*

* @param url

* @param callback

* @param params

*/

private void _postAsyn(String url, final ResultCallback<Object> callback, Param... params) {

Request request = buildPostRequest(url, params);

deliveryResult(callback, request);

}

/**

* 异步的post请求

*

* @param url

* @param callback

* @param params

*/

private void _postAsyn(String url, final ResultCallback<Object> callback, Map<String, String> params) {

Param[] paramsArr = map2Params(params);

Request request = buildPostRequest(url, paramsArr);

deliveryResult(callback, request);

}

/**

* 异步的post请求

*

* @param url

* @param callback

* @param params

*/

private void _postAsyn(String url, final ResultCallback<Object> callback, String jsonParam) {

Request request = buildPostRequest(url, jsonParam);

deliveryResult(callback, request);

}

/**

* 异步的post请求

*

* @param url

* @param callback

* @param jsonParam

* @param tag

*/

private void _postAsyn(String url, final ResultCallback<Object> callback, String jsonParam, String tag) {

Request request = buildPostRequest(url, jsonParam, tag);

deliveryResult(callback, request);

}

/**

* 同步基于post的文件上传

*

* @param params

* @return

*/

private Response _post(String url, File[] files, String[] fileKeys, Param... params) throws IOException {

Request request = buildMultipartFormRequest(url, files, fileKeys, params);

return mOkHttpClient.newCall(request).execute();

}

private Response _post(String url, File file, String fileKey) throws IOException {

Request request = buildMultipartFormRequest(url, new File[] { file }, new String[] { fileKey }, null);

return mOkHttpClient.newCall(request).execute();

}

private Response _post(String url, File file, String fileKey, Param... params) throws IOException {

Request request = buildMultipartFormRequest(url, new File[] { file }, new String[] { fileKey }, params);

return mOkHttpClient.newCall(request).execute();

}

/**

* 异步基于post的文件上传

*

* @param url

* @param callback

* @param files

* @param fileKeys

* @throws IOException

*/

private void _postAsyn(String url, ResultCallback<Object> callback, File[] files, String[] fileKeys, Param... params) throws IOException {

Request request = buildMultipartFormRequest(url, files, fileKeys, params);

deliveryResult(callback, request);

}

/**

* 异步基于post的文件上传,单文件不带参数上传

*

* @param url

* @param callback

* @param file

* @param fileKey

* @throws IOException

*/

private void _postAsyn(String url, ResultCallback<Object> callback, File file, String fileKey) throws IOException {

Request request = buildMultipartFormRequest(url, new File[] { file }, new String[] { fileKey }, null);

deliveryResult(callback, request);

}

/**

* 异步基于post的文件上传,单文件且携带其他form参数上传

*

* @param url

* @param callback

* @param file

* @param fileKey

* @param params

* @throws IOException

*/

private void _postAsyn(String url, ResultCallback<Object> callback, File file, String fileKey, Param... params) throws IOException {

Request request = buildMultipartFormRequest(url, new File[] { file }, new String[] { fileKey }, params);

deliveryResult(callback, request);

}

/**

* 取消请求

*

* @param tag

*/

private void _cancel(String tag) {

mOkHttpClient.cancel(tag);

}

private void deliveryResult(final ResultCallback<Object> callback, Request request) {

mOkHttpClient.newCall(request).enqueue(new Callback() {

@Override

public void onFailure(final Request request, final IOException e) {

sendFailedStringCallback(request, e, callback);

}

@Override

public void onResponse(final Response response) {

try {

final String string = response.body().string();

if (callback.mType == String.class) {

sendSuccessResultCallback(string, callback);

} else {

Object o = mGson.fromJson(string, callback.mType);

sendSuccessResultCallback(o, callback);

}

} catch (IOException e) {

sendFailedStringCallback(response.request(), e, callback);

} catch (com.google.gson.JsonParseException e)// Json解析的错误

{

sendFailedStringCallback(response.request(), e, callback);

}

}

});

}

private void sendFailedStringCallback(final Request request, final Exception e, final ResultCallback<Object> callback) {

mDelivery.post(new Runnable() {

@Override

public void run() {

if (callback != null)

callback.onError(request, e);

}

});

}

private void sendSuccessResultCallback(final Object object, final ResultCallback<Object> callback) {

mDelivery.post(new Runnable() {

@Override

public void run() {

if (callback != null) {

callback.onResponse(object);

}

}

});

}

private Request buildPostRequest(String url, Param[] params) {

if (params == null) {

params = new Param[0];

}

FormEncodingBuilder builder = new FormEncodingBuilder();

for (Param param : params) {

builder.add(param.key, param.value);

}

RequestBody requestBody = builder.build();

return new Request.Builder().url(url).post(requestBody).build();

}

private Request buildPostRequest(String url, String jsonParams) {

RequestBody requestBody = RequestBody.create(JSON, jsonParams);

return new Request.Builder().url(url).post(requestBody).build();

}

private Request buildPostRequest(String url, String jsonParams, String tag) {

RequestBody requestBody = RequestBody.create(JSON, jsonParams);

return new Request.Builder().url(url).post(requestBody).tag(tag).build();

}

private Request buildMultipartFormRequest(String url, File[] files, String[] fileKeys, Param[] params) {

params = validateParam(params);

MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);

for (Param param : params) {

builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + param.key + "\""), RequestBody.create(null, param.value));

}

if (files != null) {

RequestBody fileBody = null;

for (int i = 0; i < files.length; i++) {

File file = files[i];

String fileName = file.getName();

fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileName)), file);

// TODO 根据文件名设置contentType

builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + fileKeys[i] + "\"; filename=\"" + fileName + "\""), fileBody);

}

}

RequestBody requestBody = builder.build();

return new Request.Builder().url(url).post(requestBody).build();

}

private String guessMimeType(String path) {

FileNameMap fileNameMap = URLConnection.getFileNameMap();

String contentTypeFor = fileNameMap.getContentTypeFor(path);

if (contentTypeFor == null) {

contentTypeFor = "application/octet-stream";

}

return contentTypeFor;

}

private Param[] validateParam(Param[] params) {

if (params == null)

return new Param[0];

else

return params;

}

private Param[] map2Params(Map<String, String> params) {

if (params == null)

return new Param[0];

int size = params.size();

Param[] res = new Param[size];

Set<Map.Entry<String, String>> entries = params.entrySet();

int i = 0;

for (Map.Entry<String, String> entry : entries) {

res[i++] = new Param(entry.getKey(), entry.getValue());

}

return res;

}

// *************对外公布的方法************

/**

* 返回Response的同步get请求

*

* @param url

* @return

* @throws IOException

*/

public static Response getAsyn(String url) throws IOException {

return getInstance()._getAsyn(url);

}

/**

* 返回String的同步get请求

*

* @param url

* @return

* @throws IOException

*/

public static String getAsString(String url) throws IOException {

return getInstance()._getAsString(url);

}

/**

* 异步的get请求

*

* @param url

* @param callback

*/

@SuppressWarnings("rawtypes")

public static void getAsyn(String url, ResultCallback callback) {

getInstance()._getAsyn(url, callback);

}

/**

* 返回Response的同步post请求

*

* @param url

* @return

* @throws IOException

*/

public static Response post(String url, Param... params) throws IOException {

return getInstance()._post(url, params);

}

/**

* 返回String的同步post请求

*

* @param url

* @return

* @throws IOException

*/

public static String postAsString(String url, Param... params) throws IOException {

return getInstance()._postAsString(url, params);

}

/**

* 返回Response的同步post请求

*

* @param url

* @return

* @throws IOException

*/

public static Response post(String url, String jsonParam) throws IOException {

return getInstance()._post(url, jsonParam);

}

/**

* 返回String的同步post请求

*

* @param url

* @return

* @throws IOException

*/

public static String postAsString(String url, String jsonParam) throws IOException {

return getInstance()._postAsString(url, jsonParam);

}

/**

* 异步的post请求

*

* @param url

* @param callback

* @param params

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void postAsyn(String url, final ResultCallback callback, Param... params) {

getInstance()._postAsyn(url, callback, params);

}

/**

* 异步的post请求

*

* @param url

* @param callback

* @param params

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void postAsyn(String url, final ResultCallback callback, Map<String, String> params) {

getInstance()._postAsyn(url, callback, params);

}

/**

* 异步的post请求

*

* @param url

* @param callback

* @param jsonParam

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void postAsyn(String url, final ResultCallback callback, String jsonParam) {

getInstance()._postAsyn(url, callback, jsonParam);

}

/**

* 异步的post请求

*

* @param url

* @param callback

* @param jsonParam

* @param tag

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void postAsyn(String url, final ResultCallback callback, String jsonParam, String tag) {

getInstance()._postAsyn(url, callback, jsonParam, tag);

}

public static Response post(String url, File[] files, String[] fileKeys, Param... params) throws IOException {

return getInstance()._post(url, files, fileKeys, params);

}

public static Response post(String url, File file, String fileKey) throws IOException {

return getInstance()._post(url, file, fileKey);

}

public static Response post(String url, File file, String fileKey, Param... params) throws IOException {

return getInstance()._post(url, file, fileKey, params);

}

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void postAsyn(String url, ResultCallback callback, File[] files, String[] fileKeys, Param... params) throws IOException {

getInstance()._postAsyn(url, callback, files, fileKeys, params);

}

/**

* 单文件上传

*

* @param url

* @param callback

* @param file

* @param fileKey

* @throws IOException

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void postAsyn(String url, ResultCallback callback, File file, String fileKey) throws IOException {

getInstance()._postAsyn(url, callback, file, fileKey);

}

/**

* 上传文件并带参数

*

* @param url

* @param callback

* @param file

* @param fileKey

* @param params

* @throws IOException

*/

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void postAsyn(String url, ResultCallback callback, File file, String fileKey, Param... params) throws IOException {

getInstance()._postAsyn(url, callback, file, fileKey, params);

}

/**

* 取消请求

*

* @param tag

*/

public static void cancel(String tag) {

getInstance()._cancel(tag);

}

// ****************************

}

public class Param {

public Param() {

}

public Param(String key, String value) {

this.key = key;

this.value = value;

}

String key;

String value;

}

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

import com.google.gson.internal.$Gson$Types;

import com.squareup.okhttp.Request;

public abstract class ResultCallback<T> {

Type mType;

public ResultCallback() {

mType = getSuperclassTypeParameter(getClass());

}

static Type getSuperclassTypeParameter(Class<?> subclass) {

Type superclass = subclass.getGenericSuperclass();

if (superclass instanceof Class) {

throw new RuntimeException("Missing type parameter.");

}

ParameterizedType parameterized = (ParameterizedType) superclass;

return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);

}

public abstract void onError(Request request, Exception e);

public abstract void onResponse(T response);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: