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

OkHTTp简单封装

2016-04-14 17:05 579 查看
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


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