网络通讯框架之okHttpUtils

okHttpUtils封装库志支持:php

  • 通常的get请求
  • 通常的post请求
  • 基于Http的文件上传
  • 文件下载
  • 上传下载的进度回调
  • 加载图片
  • 支持请求回调,直接返回对象、对象集合
  • 支持session的保持
  • 支持自签名网站https的访问,提供方法设置下证书就行
  • 支持取消某个请求

基本方法的使用 :java

第一步:web

注入依赖:compile 'com.zhy:okhttputils:2.0.0'json

第二步:添加网络权限bash

基本的用法格式为:网络

OkHttpUtils .get() .url(url) .addParams("username", "hyman") .addParams("password", "123") .build() .execute(callback); OkHttpUtils .get() .url(url) .addParams("username", "hyman") .addParams("password", "123") .build() .execute(callback);

经过链式去根据本身的须要添加各类参数,最后调用execute(callback)进行执行,传入callback则表明是异步。若是只是execute()则表明同步的方法调用。session


GET请求异步

String url = ""; OkHttpUtils .get() .url(url) .addParams("username", "hyman") .addParams("password", "123") .build() .execute(new StringCallback() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(String response) { } }); String url = ""; OkHttpUtils .get() .url(url) .addParams("username", "hyman") .addParams("password", "123") .build() .execute(new StringCallback() { @Override public void onError(Request request, Exception e) { } @Override public void onResponse(String response) { } });

POST请求

OkHttpUtils .post() .url(url) .addParams("username", "hyman") .addParams("password", "123") .build() .execute(callback); OkHttpUtils .post() .url(url) .addParams("username", "hyman") .addParams("password", "123") .build() .execute(callback);
 

Post String
OkHttpUtils .postString() .url(url) .content(new Gson().toJson(new User("zhy", "123"))) .build() .execute(new MyStringCallback()); OkHttpUtils .postString() .url(url) .content(new Gson().toJson(new User("zhy", "123"))) .build() .execute(new MyStringCallback());
将string做为请求体传入到服务端,例如json字符串

 


Post File

 

OkHttpUtils .postFile() .url(url) .file(file) .build() .execute(new MyStringCallback()); OkHttpUtils .postFile() .url(url) .file(file) .build() .execute(new MyStringCallback());
将file做为请求体传入到服务端.
 

基于POST的文件上传(相似web上的表单)
OkHttpUtils.post()// .addFile("mFile", "messenger_01.png", file)// .addFile("mFile", "test1.txt", file2)// .url(url) .params(params)// .headers(headers)// .build()// .execute(new MyStringCallback());OkHttpUtils.post()// .addFile("mFile", "messenger_01.png", file)// .addFile("mFile", "test1.txt", file2)// .url(url) .params(params)// .headers(headers)// .build()// .execute(new MyStringCallback());

 


下载文件

OkHttpUtils// .get()// .url(url)// .build()// .execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), "gson-2.2.1.jar")// { @Override public void inProgress(float progress) { mProgressBar.setProgress((int) (100 * progress)); } @Override public void onError(Request request, Exception e) { Log.e(TAG, "onError :" + e.getMessage()); } @Override public void onResponse(File file) { Log.e(TAG, "onResponse :" + file.getAbsolutePath()); } }); OkHttpUtils// .get()// .url(url)// .build()// .execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), "gson-2.2.1.jar")// { @Override public void inProgress(float progress) { mProgressBar.setProgress((int) (100 * progress)); } @Override public void onError(Request request, Exception e) { Log.e(TAG, "onError :" + e.getMessage()); } @Override public void onResponse(File file) { Log.e(TAG, "onResponse :" + file.getAbsolutePath()); } });
 

 

显示图片

OkHttpUtils .get()// .url(url)// .build()// .execute(new BitmapCallback() { @Override public void onError(Request request, Exception e) { mTv.setText("onError:" + e.getMessage()); } @Override public void onResponse(Bitmap bitmap) { mImageView.setImageBitmap(bitmap); } }); OkHttpUtils .get()// .url(url)// .build()// .execute(new BitmapCallback() { @Override public void onError(Request request, Exception e) { mTv.setText("onError:" + e.getMessage()); } @Override public void onResponse(Bitmap bitmap) { mImageView.setImageBitmap(bitmap); } });
 

 

对于上传下载的回调

new Callback<?>() { //... @Override public void inProgress(float progress) { //use progress: 0 ~ 1 } } new Callback<?>() { //... @Override public void inProgress(float progress) { //use progress: 0 ~ 1 } }

对于传入的callback有个inProgress方法,须要拿到进度直接复写该方法便可。ide

 

 
对于自动解析为实体类
目前去除了Gson的依赖,提供了自定义Callback的方式,让用户本身去解析返回的数据,
目前提供了,, 分别用于返回string,文件下载,加载图片。StringCallbackFileCallbackBitmapCallback
固然若是你但愿解析为对象,你能够:
 public abstract class UserCallback extends Callback<User> { //非UI线程,支持任何耗时操做 @Override public User parseNetworkResponse(Response response) throws IOException { String string = response.body().string(); User user = new Gson().fromJson(string, User.class); return user; } public abstract class UserCallback extends Callback<User> { //非UI线程,支持任何耗时操做 @Override public User parseNetworkResponse(Response response) throws IOException { String string = response.body().string(); User user = new Gson().fromJson(string, User.class); return user; }
 本身使用本身喜欢的Json解析库完成便可。
 解析成List<User>,则以下: public abstract class ListUserCallback extends Callback<List<User>> { @Override public List<User> parseNetworkResponse(Response response) throws IOException { String string = response.body().string(); List<User> user = new Gson().fromJson(string, List.class); return user; } } 解析成List<User>,则以下: public abstract class ListUserCallback extends Callback<List<User>> { @Override public List<User> parseNetworkResponse(Response response) throws IOException { String string = response.body().string(); List<User> user = new Gson().fromJson(string, List.class); return user; } }
 
 

 
 对于https单向认证
 很是简单,拿到xxx.cert的证书。而后调用
OkHttpUtils.getInstance().setCertificates(inputstream); OkHttpUtils.getInstance().setCertificates(inputstream);
 

 建议使用方式,例如个人证书放在assets目录:post

 public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); try { OkHttpUtils .getInstance() .setCertificates(getAssets().open("aaa.cer"), getAssets().open("server.cer")); } catch (IOException e) { e.printStackTrace(); } } } public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); try { OkHttpUtils .getInstance() .setCertificates(getAssets().open("aaa.cer"), getAssets().open("server.cer")); } catch (IOException e) { e.printStackTrace(); } } }
 

 便可。别忘了注册Application。

注意:若是https网站为权威机构颁发的证书,不须要以上设置。自签名的证书才须要。

 

 

配置

(1)全局配置

能够在Application中,经过:
OkHttpClient client = OkHttpUtils.getInstance().getOkHttpClient(); OkHttpClient client = OkHttpUtils.getInstance().getOkHttpClient();
 
而后调用client的各类set方法。如:
 
 
client.setConnectTimeout(100000, TimeUnit.MILLISECONDS); client.setConnectTimeout(100000, TimeUnit.MILLISECONDS);
 
 

(2)为单个请求设置超时

好比涉及到文件的须要设置读写等待时间多一点。

 
 
 OkHttpUtils .get()// .url(url)// .tag(this)// .build()// .connTimeOut(20000) .readTimeOut(20000) .writeTimeOut(20000) .execute() OkHttpUtils .get()// .url(url)// .tag(this)// .build()// .connTimeOut(20000) .readTimeOut(20000) .writeTimeOut(20000) .execute()
 
 
调用build()以后,能够随即设置各类timeOut.

(3)取消单个请求

 
 
RequestCall call = OkHttpUtils.get().url(url).build(); call.cancel(); RequestCall call = OkHttpUtils.get().url(url).build(); call.cancel();
 
 

(4)根据tag取消请求

目前对于支持的方法都添加了最后一个参数Object tag,取消则经过OkHttpUtils.cancelTag(tag)执行。

 例如:在Activity中,当Activity销毁取消请求:

OkHttpUtils .get()// .url(url)// .tag(this)// .build()// @Override protected void onDestroy() { super.onDestroy(); //能够取消同一个tag的 OkHttpUtils.cancelTag(this);//取消以Activity.this做为tag的请求 } OkHttpUtils .get()// .url(url)// .tag(this)// .build()// @Override protected void onDestroy() { super.onDestroy(); //能够取消同一个tag的 OkHttpUtils.cancelTag(this);//取消以Activity.this做为tag的请求 }

 好比,当前Activity页面全部的请求以Activity对象做为tag,能够在onDestory里面统一取消。

相关文章
相关标签/搜索