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

Okhttp封装、网络层扩展

2016-03-26 13:50 543 查看



一、概述

首先在这里本片文章是以网络通信封装为主,而app开发首先重要就是网络通信,而现在主流的async、volley、okhttp等,阿么这么网络库如何能做到更好封装、更好的切换,从而不影响业务层的代码,而本文就是基于这个思路,从而封装了okhttp,并能支持封装切换到async、或者volley,后期会支持这两个库的所有特性,并在调用时候无影响,当前版本2.6,github地址:
https://github.com/apple317/HttpClientUtils
目前支持

一般的get请求 支持

一般的post请求 支持文本、表单、表单文件、单个文件操作 支持

基于Http Post的文件上传(类似表单) 支持

文件上传进度 支持

下载文件进度 支持

支持url关闭网络请求 支持

支持session的保持 支持

支持取消某个请求 支持

支持数据异步刷新操作

支持取消tag请求、支持url取消请求 支持

支持HEAD 支持

支持自签名网站https的访问,提供方法设置下证书就行 不支持

DELETE、PATCH、PUT 支持

加入网络配置、请求过程抽离 支持

加入gson解析,建议加入插件gsonformat来生成解析对象,传入解析类方法setParse

加入url表识来区分请求 支持

二、引用注意

Android Studio
使用前,对于Android Studio的用户,可以选择添加:
compile project(':HttpClientUtils')


三、使用说明

初始化配置

HttpConfiguration.Builder configuration=new HttpConfiguration.Builder(getApplicationContext());
configuration.connectTimeout(2000);
configuration.retryOnConnectionFailure(true);
configuration.readTimeout(2000);
configuration.writeTimeout(2000);
configuration.diskCacheSize(1000 * 1024);
configuration.diskCacheDir(getCacheDir());
BaseHttpClient.getBaseClient().init(configuration.build());
里面设置超时、读写时间、缓冲路径等

Get传入方法

/**
* 普通参数请求方式
* url 传入网络地址
* put传入值
* tag设置tag
*/
public void getParam(View view) {
BaseHttpClient.getBaseClient().newBuilder()
.url("http://api.dianping.com/v1/metadata/get_cities_with_deals")
.put("appkey", "56065429")
.setParse(UserBean.class)
.put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB")
.setTag("deals").build().execute(new HttpCallback() {
@Override
public void onSuccess(String content, BaseHttpClient object, Object parse) {
//刷新ui操作
}

@Override
public void onError(Throwable error, BaseHttpClient client) {

}
});
}

post文本上传

在demo中PostActivity中的postStringData方法:

/**
* post上传字符串
* addUrl传入url地址
* put传入参数可以
* apple_txt 这个是专门用来传入文本上传的,请注意
*/
public void postStringData(View view) {
/**
* 第一种写法
*/
BaseHttpClient.getBaseClient().newBuilder().url("url")
.content("你好好好").method(METHOD.POST_STRING)
.build().execute(new HttpCallback() {
@Override
public void onSuccess(String content, BaseHttpClient object, Object parse) {
//刷新ui
}

@Override
public void onError(Throwable error, BaseHttpClient client) {

}
});
}


post普通表单提交

在demo中PostActivity中的postData方法:
/**
* 普通post请求数据
* 默认以表单提交
* addUrl传入url地址
* put传入参数可以
*setTag 设置tag
*/
public void postData(View view) {
/**
* 第一种写法
*/
BaseHttpClient.getBaseClient().newBuilder()
.url("url")
.put("device_id", "1236716")
.setTag("postactivity").put("os", "2")
.put("version", "2.1.0").
put("mobile", "13621937708").method(METHOD.POST_FORM)
.build().execute(new HttpCallback() {
@Override
public void onSuccess(String content, BaseHttpClient object, Object parse) {
//刷新UI
}
@Override
public void onError(Throwable error, BaseHttpClient client) {

}
});
}




Post表单文件上传

在demo中PostActivity中的postFormFile方法:

/**
* post
* 表单文件上传
* 默认以表单提交
* addUrl传入url地址
* put传入参数可以
*setTag 设置tag
* put 传入logo为文件上传定义接口名称 value:为文件对象
* setBaseParams 通过这样的传入参数对象
* 上传文件onProgress 会返回当前网络上传的进度
* POST_FORM 是普通表单提交
*/
public void postFormFile(View view) {
try {
File file=new File("path");
ArrayList<File> arrayList=new ArrayList<File>();
arrayList.add(file);
//            File file = new File(Environment.getExternalStorageDirectory()
//                    , "4cc75752fa532553bf7b6f7e00f26db8.png");
BaseHttpClient.getBaseClient().newBuilder()
.url("url")
.put("game", "lol")
.put("logo", arrayList)
.put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12")
.put("version", "2.1.0")
.put("device_id","867905026687709")
.put("os","2")
.method(METHOD.POST_FORM_FILE).build()
.execute(new HttpCallback() {
@Override
public void onSuccess(String content, BaseHttpClient object, Object parse) {
//刷新ui
}

@Override
public void onError(Throwable error, BaseHttpClient client) {

}
});
} catch (Exception e) {
e.printStackTrace();
}
}

文件上传进度

在demo中PostActivity中postFormFileProgress方法:

/**
* post
* 表单文件上传
* 默认以表单提交
* addUrl传入url地址
* put传入参数可以
*setTag 设置tag
* put 传入logo为文件上传定义接口名称 value:为文件对象 也可以为文件数组对象
* setBaseParams 通过这样的传入参数对象
* 类型一定要传入POST_FORM_PROGRESS
* 上传文件onProgress 会返回当前网络上传的进度
*/
public void postFormFileProgress(View view) {
try {
File file = new File(Environment.getExternalStorageDirectory()
, "4cc75752fa532553bf7b6f7e00f26db8.png");
BaseHttpClient.getBaseClient().newBuilder().url("url")
.put("game", "lol")
.put("logo", file)
.put("token","ee595bd5078a6e67a110c6bd8828c8e2a2388c12")
.put("version", "2.1.0")
.put("device_id","867905026687709")
.put("os","2")
.method(METHOD.POST_FORM_PROGRESS).build()
.execute(new UploadCallback() {
@Override
public void onSuccess(String content, BaseHttpClient object, Object parse) {

}

@Override
public void onError(Throwable error, BaseHttpClient client) {

}

@Override
public void uploadProgress(long bytesRead, long contentLength, boolean done) {
mProgressBar.setProgress((int) (100 * (float)bytesRead * 1.0f / contentLength));
}
});
} catch (Exception e) {
e.printStackTrace();
}
}

文件下载进度


在demo中DownFileActivity中的downData方法:

/**
* addUrl 添加url地址
* put传入参数可以
*setTag 设置tag
* downName 下载文件命名
* downDir 下载文件目录 如果不传会默认生成一个getCacheDirectory
* DownEntity 下载返回数据实体:
* public String name;//名称
public String path;//保存地址
public String url;
public int httpCode;//http网络状态
//下载是否完成
public boolean statue;//下载是否完成
public long currentByte;//下载当前字节数
public long totalByte;//下载总字节数
public boolean isExecuted;//下载是否执行
public String dir;//下载目录

public boolean isCanceled;//下载是否取消
public String message;//下载返回消息
* @param view
*/
public void downData(View view){
/**
* 第一种写法
*/
BaseHttpClient.getBaseClient().newBuilder().url("http://112.65.235.160/vlive.qqvideo.tc.qq.com/m0019469p4a.mp4?vkey=4C7F305D62ABA38AF8BF474C40A0DF9700C8F07BF29BE26D76F17F8A7E73B9FEB1424CC479C4C863BFBDD095AA5EBE49A0CDE3EAEB32E2AD0C009E7C5B37521C0912AF6905C70C601471E664777B9C38C726B03E8D193D62&br=34&platform=2&fmt=msd&sdtfrom=v3010&type=mp4&locid=89489e75-bb18-40e4-989b-89d6b34adf32&size=56306437&ocid=1362567084")
.downName("apple_nba").method(METHOD.DOWNLOAD_FILE).build().execute(new DownCallback() {
@Override
public void downProgress(DownEntity entity) {
Log.i("HU", "======bytes===" + entity.currentByte + "==contenLength==" + entity.totalByte);
id_progress.setProgress((int) (100 * (float) entity.currentByte * 1.0f / entity.totalByte));
txt_content.setText("当前下载的文件目录是"+entity.path+"文件名称:"+entity.name+"网络返回code"+entity.httpCode+"===服务端返回消息=="+entity.message);
}
});
}




取消单个网络请求

1.第一种方式通过url要关闭

BaseHttpClient.getBaseClient().cancelTag("url");

2.第二种方式通过传入tag来关闭

BaseHttpClient.getBaseClient()
.setTag("deals")


mParams.setTag("tag");

取消tag网络请求

比如,在请求中传入tag对象,销魂时候可以统一销毁同一tag对象访问
@Override
protected void onDestroy()
{
super.onDestroy();
//可以取消同一个tag的
BaseHttpClient.getBaseClient(getApplicationContext()).cancelTag("tag对象");
}

HEAD请求传入

ConcurrentHashMap<String, String> headMap=new ConcurrentHashMap<String, String>();
headMap.put("device","1231231241");
BaseHttpClient.getBaseClient().newBuilder()
.url("http://api.dianping.com/v1/metadata/get_cities_with_deals")
.put("appkey", "56065429")
.setParse(UserBean.class)
.setHeadMap(headMap)
.put("sign", "AF24BF8A3F31D22D25422BCDD86AA322F43B5BAB")
.setTag("deals").build().execute(new HttpCallback() {
@Override
public void onSuccess(String content, BaseHttpClient object, Object parse) {
UserBean userBean=(UserBean)parse;
txt_content.setText(userBean.getCities().get(0) + "type===" );
}

@Override
public void onError(Throwable error, BaseHttpClient client) {

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