OkHTTp简单封装
2016-04-14 17:05
579 查看
1.开网络权限
2.所需要的jar包
gson-2.2.4.jar
okhttp-2.5.0.jar
okio-1.6.0.jar
导入jar包并和项目关联
3.分装类OkHttpClientManager
4.MainActivity中调用
5.所需要的javaBean
Entity
源码及jar包下载:
1.开网络权限
2.所需要的jar包
gson-2.2.4.jar
okhttp-2.5.0.jar
okio-1.6.0.jar
导入jar包并和项目关联
3.分装类OkHttpClientManager
4.MainActivity中调用
5.所需要的javaBean
Entity
源码及jar包下载:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
2.所需要的jar包
gson-2.2.4.jar
okhttp-2.5.0.jar
okio-1.6.0.jar
导入jar包并和项目关联
3.分装类OkHttpClientManager
<span style="font-size:18px;">package android.test.com.okhttp1; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Looper; import android.widget.ImageView; import com.google.gson.Gson; import com.google.gson.internal.$Gson$Types; 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; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.net.CookieManager; import java.net.CookiePolicy; import java.net.FileNameMap; import java.net.URLConnection; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Created by Administrator on 2016/4/13. */ public class OkHttpClientManager { private static OkHttpClientManager mInstance; private OkHttpClient mOkHttpClient; private Handler mDelivery; private Gson mGson; private static final String TAG = "OkHttpClientManager"; private OkHttpClientManager() { mOkHttpClient = new OkHttpClient(); //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 * @param callback */ private void _getAsyn(String url, final ResultCallback callback) { final Request request = new Request.Builder() .url(url) .build(); deliveryResult(callback, request); } /** * 异步的post请求 * * @param url * @param callback * @param params */ private void _postAsyn(String url, final ResultCallback 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 callback, Map<String, String> params) { Param[] paramsArr = map2Params(params); Request request = buildPostRequest(url, paramsArr); 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 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 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 callback, File file, String fileKey, Param... params) throws IOException { Request request = buildMultipartFormRequest(url, new File[]{file}, new String[]{fileKey}, params); deliveryResult(callback, request); } /** * 异步下载文件 * * @param url * @param destFileDir 本地文件存储的文件夹 * @param callback */ private void _downloadAsyn(final String url, final String destFileDir, final ResultCallback callback) { final Request request = new Request.Builder() .url(url) .build(); final Call call = mOkHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(final Request request, final IOException e) { sendFailedStringCallback(request, e, callback); } @Override public void onResponse(Response response) { InputStream is = null; byte[] buf = new byte[2048]; int len = 0; FileOutputStream fos = null; try { is = response.body().byteStream(); File file = new File(destFileDir, getFileName(url)); fos = new FileOutputStream(file); while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } fos.flush(); //如果下载文件成功,第一个参数为文件的绝对路径 sendSuccessResultCallback(file.getAbsolutePath(), callback); } catch (IOException e) { sendFailedStringCallback(response.request(), e, callback); } finally { try { if (is != null) is.close(); } catch (IOException e) { } try { if (fos != null) fos.close(); } catch (IOException e) { } } } }); } private String getFileName(String path) { int separatorIndex = path.lastIndexOf("/"); return (separatorIndex < 0) ? path : path.substring(separatorIndex + 1, path.length()); } private void setErrorResId(final ImageView view, final int errorResId) { mDelivery.post(new Runnable() { @Override public void run() { view.setImageResource(errorResId); } }); } //*************对外公布的方法************ /** 异步的get请求 * * @param url * @param callback */ public static void getAsyn(String url, ResultCallback callback) { getInstance()._getAsyn(url, callback); } public static void postAsyn(String url, final ResultCallback callback, Param... params) { getInstance()._postAsyn(url, callback, params); } /** * 异步的post请求 * @param url * @param callback * @param params */ public static void postAsyn(String url, final ResultCallback callback, Map<String, String> params) { getInstance()._postAsyn(url, callback, params); } 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); } public static void postAsyn(String url, ResultCallback callback, File[] files, String[] fileKeys, Param... params) throws IOException { getInstance()._postAsyn(url, callback, files, fileKeys, params); } public static void postAsyn(String url, ResultCallback callback, File file, String fileKey) throws IOException { getInstance()._postAsyn(url, callback, file, fileKey); } public static void postAsyn(String url, ResultCallback callback, File file, String fileKey, Param... params) throws IOException { getInstance()._postAsyn(url, callback, file, fileKey, params); } public static void downloadAsyn(String url, String destDir, ResultCallback callback) { getInstance()._downloadAsyn(url, destDir, callback); } //**************************** 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; } private static final String SESSION_KEY = "Set-Cookie"; private static final String mSessionKey = "JSESSIONID"; private Map<String, String> mSessions = new HashMap<String, String>(); private void deliveryResult(final ResultCallback 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 callback) { mDelivery.post(new Runnable() { @Override public void run() { if (callback != null) callback.onError(request, e); } }); } private void sendSuccessResultCallback(final Object object, final ResultCallback 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(); } public static 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); } public static class Param { public Param() { } public Param(String key, String value) { this.key = key; this.value = value; } String key; String value; } } </span>
4.MainActivity中调用
<span style="font-size:18px;">/** * 分装基本完成 * */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // mygetObjectjson(); // mypostObjectjson(); mygetFuZaObjectjson(); } /** * 封装后get的使用 * 已测试 */ private void myGet(){ OkHttpClientManager.getAsyn("https://www.baidu.com", new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(String u) { // 主线程 Log.e("1", "返回数据:" + u); } }); } /** * 分装后的post请求 * 已测试 * */ private void myPost(){ // 设置参数 Map<String,String>map = new HashMap<String,String>(); map.put("type", "1"); // 请求 OkHttpClientManager.postAsyn("http://112.124.22.238:8081/course_api/banner/query", new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(String response) { Log.e("1", "" + response.toString()); } }, map); } /** * get * 整合json解析json[] * 已测试 */ private void mygetArrayjson(){ OkHttpClientManager.getAsyn("http://112.124.22.238:8081/course_api/banner/query?type=1", new OkHttpClientManager.ResultCallback<List<Entity>>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(List<Entity> entitity) { Log.e("TAG", entitity.size() + ""); for (int i = 0; i < entitity.size(); i++) { Log.e("1", "" + entitity.get(i).getName().toString()); } } }); } /** * get * 整合json解析{} * 已测试 */ private void mygetObjectjson(){ OkHttpClientManager.getAsyn("http://fanyi.youdao.com/openapi.do?keyfrom=woshilaowang3&key=940408814&type=data&doctype=json&version=1.1&q=牛", new OkHttpClientManager.ResultCallback<Cow>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(Cow cow) { // 主线程 Log.e("1", "" + cow.getQuery()); } }); } /** * post * 整合json解析json[] * 已测试 */ private void mypostArrayjson(){ // 设置参数 Map<String,String>map = new HashMap<String,String>(); map.put("type", "1"); // 请求 OkHttpClientManager.postAsyn("http://112.124.22.238:8081/course_api/banner/query", new OkHttpClientManager.ResultCallback<Entity>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(Entity entititys) { entititys.getName(); Log.e("1", "" + entititys.getName()); } }, map); } /** * post * 整合json解析object{} * 已测试 */ private void mypostObjectjson(){ // 设置参数 Map<String,String>map = new HashMap<String,String>(); map.put("q", "牛"); // 请求 OkHttpClientManager.postAsyn("http://fanyi.youdao.com/openapi.do?keyfrom=woshilaowang3&key=940408814&type=data&doctype=json&version=1.1", new OkHttpClientManager.ResultCallback<Cow>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(Cow cow) { Log.e("1",cow.getQuery()); } }, map); } /** * 解析复杂数据 * 和解析一个对象是一样的,只是在javaBean中改变即可 */ private void mygetFuZaObjectjson(){ OkHttpClientManager.getAsyn("http://fanyi.youdao.com/openapi.do?keyfrom=woshilaowang3&key=940408814&type=data&doctype=json&version=1.1&q=牛", new OkHttpClientManager.ResultCallback<JsonBean>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(JsonBean jsonBean) { List<JsonBean.Web> web = jsonBean.web; for (JsonBean.Web webData : web) { String webDataStr=webData.key; Log.e("1",webDataStr); } } }); } /** * 文件上传且携带参数 * 我们希望提供一个方法,传入url,params,file,callback即可。 * 未测试 */ // private void upLoaderFile(){ // OkHttpClientManager.postAsyn("http://192.168.1.103:8080/okHttpServer/fileUpload",// // new OkHttpClientManager.ResultCallback<String>() // { // // @Override // public void onError(Request request, Exception e) { // // } // // @Override // public void onResponse(String result) // { // // } // },// // file,// // "mFile",// // new OkHttpClientManager.Param[]{ // new OkHttpClientManager.Param("username", "zhy"), // new OkHttpClientManager.Param("password", "123")} // ); // // } /** * 文件下载 * 对于文件下载,提供url,目标dir,callback即可。 * 未测试 */ private void downLoader(){ OkHttpClientManager.downloadAsyn( "http://192.168.1.103:8080/okHttpServer/files/messenger_01.png", Environment.getExternalStorageDirectory().getAbsolutePath(), new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(String response) { //文件下载成功,这里回调的reponse为文件的absolutePath } }); } } </span>
5.所需要的javaBean
Entity
<span style="font-size:18px;">public class Entity { // "id": 1, // "name": "音箱狂欢", // "description": null, // "imgUrl": "http://7mno4h.com2.z0.glb.qiniucdn.com/5608f3b5Nc8d90151.jpg", // "type": 1 private String id; private String name; private String description; private String imgUrl; private String type; public Entity(){ } public Entity(String id, String name, String description, String imgUrl, String type) { this.id = id; this.name = name; this.description = description; this.imgUrl = imgUrl; this.type = type; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } public String getType() { return type; } public void setType(String type) { this.type = type; } } </span>Cow
<span style="font-size:18px;">public class Cow { private String query; public String getQuery() { return query; } public void setQuery(String query) { this.query = query; } }</span>JsonBean
<span style="font-size:18px;">public class JsonBean { public String query; public List<Web> web; public static class Web { public String key; } }</span>
源码及jar包下载:
http://download.csdn.net/detail/zhaihaohao1/9490986
参考文章:
http://blog.csdn.net/lmj623565791/article/details/47911083
1.开网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
2.所需要的jar包
gson-2.2.4.jar
okhttp-2.5.0.jar
okio-1.6.0.jar
导入jar包并和项目关联
3.分装类OkHttpClientManager
<span style="font-size:18px;">package android.test.com.okhttp1; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Looper; import android.widget.ImageView; import com.google.gson.Gson; import com.google.gson.internal.$Gson$Types; 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; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.net.CookieManager; import java.net.CookiePolicy; import java.net.FileNameMap; import java.net.URLConnection; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Created by Administrator on 2016/4/13. */ public class OkHttpClientManager { private static OkHttpClientManager mInstance; private OkHttpClient mOkHttpClient; private Handler mDelivery; private Gson mGson; private static final String TAG = "OkHttpClientManager"; private OkHttpClientManager() { mOkHttpClient = new OkHttpClient(); //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 * @param callback */ private void _getAsyn(String url, final ResultCallback callback) { final Request request = new Request.Builder() .url(url) .build(); deliveryResult(callback, request); } /** * 异步的post请求 * * @param url * @param callback * @param params */ private void _postAsyn(String url, final ResultCallback 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 callback, Map<String, String> params) { Param[] paramsArr = map2Params(params); Request request = buildPostRequest(url, paramsArr); 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 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 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 callback, File file, String fileKey, Param... params) throws IOException { Request request = buildMultipartFormRequest(url, new File[]{file}, new String[]{fileKey}, params); deliveryResult(callback, request); } /** * 异步下载文件 * * @param url * @param destFileDir 本地文件存储的文件夹 * @param callback */ private void _downloadAsyn(final String url, final String destFileDir, final ResultCallback callback) { final Request request = new Request.Builder() .url(url) .build(); final Call call = mOkHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(final Request request, final IOException e) { sendFailedStringCallback(request, e, callback); } @Override public void onResponse(Response response) { InputStream is = null; byte[] buf = new byte[2048]; int len = 0; FileOutputStream fos = null; try { is = response.body().byteStream(); File file = new File(destFileDir, getFileName(url)); fos = new FileOutputStream(file); while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } fos.flush(); //如果下载文件成功,第一个参数为文件的绝对路径 sendSuccessResultCallback(file.getAbsolutePath(), callback); } catch (IOException e) { sendFailedStringCallback(response.request(), e, callback); } finally { try { if (is != null) is.close(); } catch (IOException e) { } try { if (fos != null) fos.close(); } catch (IOException e) { } } } }); } private String getFileName(String path) { int separatorIndex = path.lastIndexOf("/"); return (separatorIndex < 0) ? path : path.substring(separatorIndex + 1, path.length()); } private void setErrorResId(final ImageView view, final int errorResId) { mDelivery.post(new Runnable() { @Override public void run() { view.setImageResource(errorResId); } }); } //*************对外公布的方法************ /** 异步的get请求 * * @param url * @param callback */ public static void getAsyn(String url, ResultCallback callback) { getInstance()._getAsyn(url, callback); } public static void postAsyn(String url, final ResultCallback callback, Param... params) { getInstance()._postAsyn(url, callback, params); } /** * 异步的post请求 * @param url * @param callback * @param params */ public static void postAsyn(String url, final ResultCallback callback, Map<String, String> params) { getInstance()._postAsyn(url, callback, params); } 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); } public static void postAsyn(String url, ResultCallback callback, File[] files, String[] fileKeys, Param... params) throws IOException { getInstance()._postAsyn(url, callback, files, fileKeys, params); } public static void postAsyn(String url, ResultCallback callback, File file, String fileKey) throws IOException { getInstance()._postAsyn(url, callback, file, fileKey); } public static void postAsyn(String url, ResultCallback callback, File file, String fileKey, Param... params) throws IOException { getInstance()._postAsyn(url, callback, file, fileKey, params); } public static void downloadAsyn(String url, String destDir, ResultCallback callback) { getInstance()._downloadAsyn(url, destDir, callback); } //**************************** 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; } private static final String SESSION_KEY = "Set-Cookie"; private static final String mSessionKey = "JSESSIONID"; private Map<String, String> mSessions = new HashMap<String, String>(); private void deliveryResult(final ResultCallback 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 callback) { mDelivery.post(new Runnable() { @Override public void run() { if (callback != null) callback.onError(request, e); } }); } private void sendSuccessResultCallback(final Object object, final ResultCallback 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(); } public static 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); } public static class Param { public Param() { } public Param(String key, String value) { this.key = key; this.value = value; } String key; String value; } } </span>
4.MainActivity中调用
<span style="font-size:18px;">/** * 分装基本完成 * */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // mygetObjectjson(); // mypostObjectjson(); mygetFuZaObjectjson(); } /** * 封装后get的使用 * 已测试 */ private void myGet(){ OkHttpClientManager.getAsyn("https://www.baidu.com", new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(String u) { // 主线程 Log.e("1", "返回数据:" + u); } }); } /** * 分装后的post请求 * 已测试 * */ private void myPost(){ // 设置参数 Map<String,String>map = new HashMap<String,String>(); map.put("type", "1"); // 请求 OkHttpClientManager.postAsyn("http://112.124.22.238:8081/course_api/banner/query", new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(String response) { Log.e("1", "" + response.toString()); } }, map); } /** * get * 整合json解析json[] * 已测试 */ private void mygetArrayjson(){ OkHttpClientManager.getAsyn("http://112.124.22.238:8081/course_api/banner/query?type=1", new OkHttpClientManager.ResultCallback<List<Entity>>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(List<Entity> entitity) { Log.e("TAG", entitity.size() + ""); for (int i = 0; i < entitity.size(); i++) { Log.e("1", "" + entitity.get(i).getName().toString()); } } }); } /** * get * 整合json解析{} * 已测试 */ private void mygetObjectjson(){ OkHttpClientManager.getAsyn("http://fanyi.youdao.com/openapi.do?keyfrom=woshilaowang3&key=940408814&type=data&doctype=json&version=1.1&q=牛", new OkHttpClientManager.ResultCallback<Cow>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(Cow cow) { // 主线程 Log.e("1", "" + cow.getQuery()); } }); } /** * post * 整合json解析json[] * 已测试 */ private void mypostArrayjson(){ // 设置参数 Map<String,String>map = new HashMap<String,String>(); map.put("type", "1"); // 请求 OkHttpClientManager.postAsyn("http://112.124.22.238:8081/course_api/banner/query", new OkHttpClientManager.ResultCallback<Entity>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(Entity entititys) { entititys.getName(); Log.e("1", "" + entititys.getName()); } }, map); } /** * post * 整合json解析object{} * 已测试 */ private void mypostObjectjson(){ // 设置参数 Map<String,String>map = new HashMap<String,String>(); map.put("q", "牛"); // 请求 OkHttpClientManager.postAsyn("http://fanyi.youdao.com/openapi.do?keyfrom=woshilaowang3&key=940408814&type=data&doctype=json&version=1.1", new OkHttpClientManager.ResultCallback<Cow>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(Cow cow) { Log.e("1",cow.getQuery()); } }, map); } /** * 解析复杂数据 * 和解析一个对象是一样的,只是在javaBean中改变即可 */ private void mygetFuZaObjectjson(){ OkHttpClientManager.getAsyn("http://fanyi.youdao.com/openapi.do?keyfrom=woshilaowang3&key=940408814&type=data&doctype=json&version=1.1&q=牛", new OkHttpClientManager.ResultCallback<JsonBean>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(JsonBean jsonBean) { List<JsonBean.Web> web = jsonBean.web; for (JsonBean.Web webData : web) { String webDataStr=webData.key; Log.e("1",webDataStr); } } }); } /** * 文件上传且携带参数 * 我们希望提供一个方法,传入url,params,file,callback即可。 * 未测试 */ // private void upLoaderFile(){ // OkHttpClientManager.postAsyn("http://192.168.1.103:8080/okHttpServer/fileUpload",// // new OkHttpClientManager.ResultCallback<String>() // { // // @Override // public void onError(Request request, Exception e) { // // } // // @Override // public void onResponse(String result) // { // // } // },// // file,// // "mFile",// // new OkHttpClientManager.Param[]{ // new OkHttpClientManager.Param("username", "zhy"), // new OkHttpClientManager.Param("password", "123")} // ); // // } /** * 文件下载 * 对于文件下载,提供url,目标dir,callback即可。 * 未测试 */ private void downLoader(){ OkHttpClientManager.downloadAsyn( "http://192.168.1.103:8080/okHttpServer/files/messenger_01.png", Environment.getExternalStorageDirectory().getAbsolutePath(), new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(String response) { //文件下载成功,这里回调的reponse为文件的absolutePath } }); } } </span>
5.所需要的javaBean
Entity
<span style="font-size:18px;">public class Entity { // "id": 1, // "name": "音箱狂欢", // "description": null, // "imgUrl": "http://7mno4h.com2.z0.glb.qiniucdn.com/5608f3b5Nc8d90151.jpg", // "type": 1 private String id; private String name; private String description; private String imgUrl; private String type; public Entity(){ } public Entity(String id, String name, String description, String imgUrl, String type) { this.id = id; this.name = name; this.description = description; this.imgUrl = imgUrl; this.type = type; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } public String getType() { return type; } public void setType(String type) { this.type = type; } } </span>Cow
<span style="font-size:18px;">public class Cow { private String query; public String getQuery() { return query; } public void setQuery(String query) { this.query = query; } }</span>JsonBean
<span style="font-size:18px;">public class JsonBean { public String query; public List<Web> web; public static class Web { public String key; } }</span>
源码及jar包下载:
http://download.csdn.net/detail/zhaihaohao1/9490986
参考文章:
http://blog.csdn.net/lmj623565791/article/details/47911083
相关文章推荐
- Android学习之使用HttpURLConnection下载文件
- TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节
- TCP/IP详解学习笔记(6)-UDP协议
- nginx网站开启https访问,http自动跳转到https
- TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute
- Android学习之使用HttpURLConnection上传单多个文件
- Picasso的基本用法及如何加载网络图片和本地图片
- TCP/IP详解之IP协议ARP协议和RARP协议
- TCP/IP详解学习笔记(2)-数据链路层
- Android学习之使用HttpURLConnection上传单个文件
- TCP/IP详解学习笔记(1)-基本概念
- Volley的网络请求实例
- HTTP协议
- 在https的tomcat环境中,使某些特殊的资源通过http来访问
- 网络数据包发送接收全过程
- epoll + 多线程实现并发网络连接处理
- iOS开发网络篇—发送GET和POST请求(使用NSURLSession)
- 使用virtualbox设置双网卡,桥接+内部网络
- 近期的安卓学习开发SOS APP的一些总结文档 (拨打电话 加载首页图片的异步代码 判断是否有网络代码)
- 模板方法模式