OkHttp的简单使用

OkHttp是Square公司主导的一个网络请求开源框架。在github项目里OkHttp是这样介绍的:An HTTP & HTTP/2 client for Android and Java applications意指:一个Java或者安卓程序的HTTP&HTTP/2客户端。除此之外OkHttp的强大之处还体现在Google官方推荐使用。在我的毕业设计中我就使用了OkHttp。不过那时候使用的还是2.7的版本,现在已经更新到了3.x版本了。那么接下来我们了解一下OkHttp2.7,OkHttp3.x两者的简单实用。

请求配置:

//okhttp2.7
com.squareup.okhttp.OkHttpClient client = new OkHttpClient();
//okhttp3.x
okhttp3.OkHttpClient client = new OkHttpClient();
//超时设置
client.setReadTimeout(readTimeout, TimeUnit.SECONDS);
client.setWriteTimeout(writeTimeout, TimeUnit.SECONDS);
client.setConnectTimeout(connectTimeout, TimeUnit.SECONDS);
//cookie enabled
client.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));

生成Get请求:

okhttp2.7与 okhttp3.x的get请求基本没有什么差别的,以下添加请求头的时候可以添加多个。其中它也提供了一个headers的方法方便添加多个请求头

return new Request
.Builder()
.addHeader("sessionId","xxxxx")//添加请求头
.url(url)//请求地址
.build();

生成Post请求:

post请求的主要区别在于RequestBody添加键值对,okHttp2.7用的是new FormEncodingBuilder(),而OkHttp3.x用的是FormBody.Builder();

return new Request
.Builder()
.url(url)
.addHeader("xxx", "xxx")//请求头
.addHeader("xxx", "xxx")//请求头
.post(new FormEncodingBuilder()//或者是FormBody.Builder()
.add("name", "zhangyuting")
.add("age", "23").build())//RequesetBody
.build();

生成其他请求:

其它请求主要包括delete、put、head、patch等等其中put、head、patch的用法基本跟post一致,而delete提供了方法一个要穿参数一个不用传参数,因此在不同场合可以根据不同的需求添加以上几个Http请求方法。

发起异步请求:

通过以上生成的任何一个请求,我们就可以发起请求并获得请求回调结果,其中OkHttp向我们提供了异步请求以及同步请求。首先我们来看一下异步请求回调具体是如何实现的。异步时在callback的onResponse触发时可更新UI

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
//可能的原因有服务端异常未部署接口。或者是网络问题
LogUtils.e(request.url() + " ->>>method:" + request.method());
sendFailureCallback(callback, e);
}
@Override
public void onResponse(Response response) throws IOException {
////此方法表明网络请求回调成功,一般来说我们以返回码200表示请求成功并返回相应的json对象。
LogUtils.e(response.request().url()
+ " ->>>code:" + response.code()
+ " ->>>method:" + response.request().method());
if (response.code() != 200) {
//常见的返回码有500、400,404等等。这个根据你们的服务端输出的日志看是什么原因有
//可能是服务端并未部署好或者是参数有问题
sendFailureCallback(callback, null);
return;
}
try {
String str = response.body().string();//回调成功更新主线程UI
sendSuccessCallback(callback, str);
} catch (final Exception e) {
LogUtils.e("convert json failure");
sendFailureCallback(callback, e);
}
}
});
//okhttp3.x在回调方法中添加了Call参数m,这个参数可以获取请求的所有信息,以及取消请求等等
client.newCall(null).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, call.request().url() + " ->>>method:" + call.request().method());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e(TAG, call.request().url() + " ->>>method:" + call.request().method());
}
});

发起同步请求:

同步方法会阻塞线程,不要在UI线程使用

try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()){
if (response.code()==200){
sendSuccessCallback(callback,response.body().string());
}else {
sendFailureCallback(callback,null);
}
}
} catch (IOException e) {
e.printStackTrace();
sendFailureCallback(callback,e);
}

OkHttp基本封装:

要用好一个好的开源框架,对其做基本的封装是很有必要的。这样一来可以在使用的地方减少代码量,保持代码整洁。下面我们做最基本的封装。然后就可以在代码中使用了。下面我就直接贴代码有点长。

/**
* api 请求类
* Created by zhangyuting on 2016/3/11.
*/
public class Apiclient {
private static String TAG = Apiclient.class.getSimpleName();
public static Apiclient instance;
private int connectTimeout = 10;// 10秒
private int writeTimeout = 10;// 10秒
private int readTimeout = 15;// 15秒
private OkHttpClient client;
private WeakHandler handler;
public Apiclient() {
handler = new WeakHandler(Looper.getMainLooper());//主线程更新UI
//okhttp
client = new OkHttpClient();
client.setReadTimeout(readTimeout, TimeUnit.SECONDS);
client.setWriteTimeout(writeTimeout, TimeUnit.SECONDS);
client.setConnectTimeout(connectTimeout, TimeUnit.SECONDS);
//cookie enabled
client.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));
}
public static Apiclient getInstance() {
if (instance == null) {
synchronized (Apiclient.class) {
if (instance == null) {
instance = new Apiclient();
}
}
}
return instance;
}
/**
* get 请求
*
* @param url 请求url
* @param callback 回调
* @param isAsync 是否同步请求
*/
public void doGet(String url, final ResultCallback callback,Boolean isAsync) {
deliverRequest(OkHttpHelpter.getInstance().getRequest(url), callback,isAsync);
}
/**
* post 请求
*
* @param url
* @param params
* @param callback
*/
public void doPost(String url, Map<String, String> params, final ResultCallback callback,Boolean isAsync) {
deliverRequest(OkHttpHelpter.getInstance().postRequest(url, params), callback,isAsync);
}
private void deliverRequest(Request request, final ResultCallback callback,Boolean isAsync) {
if(isAsync){
//同步请求
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()){
if (response.code()==200){
sendSuccessCallback(callback,response.body().string());
}else {
sendFailureCallback(callback,null);
}
}
} catch (IOException e) {
e.printStackTrace();
sendFailureCallback(callback,e);
}
return;
}
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
LogUtils.e(request.url() + " ->>>method:" + request.method());
sendFailureCallback(callback, e);
}
@Override
public void onResponse(Response response) throws IOException {
LogUtils.e(response.request().url()
+ " ->>>code:" + response.code()
+ " ->>>method:" + response.request().method());
if (response.code() != 200) {
sendFailureCallback(callback, null);
return;
}
try {
String str = response.body().string();
sendSuccessCallback(callback, str);
} catch (final Exception e) {
LogUtils.e("convert json failure");
sendFailureCallback(callback, e);
}
}
});
}
/**
* 请求回调成功,主线程更新UI
*
* @param object
*/
private void sendSuccessCallback(final ResultCallback callback, final Object object) {
handler.post(new Runnable() {
@Override
public void run() {
callback.onSuccess(object);
LogUtils.e((String) object);
}
});
}
/**
* 网络请求回调失败
*
* @param callback
* @param e
*/
private void sendFailureCallback(final ResultCallback callback, final Exception e) {
handler.post(new Runnable() {
@Override
public void run() {
callback.onFailure(e);
LogUtils.e("network_exception" + e);
}
});
}
/**
* http请求回调类,回调方法在UI线程中执行
*
* @param <T>
*/
public static abstract class ResultCallback<T> {
/**
* 请求成功回调
*
* @param response
*/
public abstract void onSuccess(T response);
/**
* 请求失败回调
*
* @param e
*/
public abstract void onFailure(Exception e);
}
/**
* OkHttp网络连接封装工具类
* Created by zhangyuting on 2016/3/11.
*/
public class OkHttpHelpter {
public static OkHttpHelpter instance;
public static OkHttpHelpter getInstance() {
if (instance == null) {
synchronized (OkHttpHelpter.class) {
if (instance == null) {
instance = new OkHttpHelpter();
}
}
}
return instance;
}
/**
* get 请求
*
* @param url
* @return
*/
public Request getRequest(String url) {
if (UserInfoCache.getInstance(BaseApplication.getInstance()).isLogin()) {
return new Request.Builder().url(url).addHeader(CommonConts.SESSION_ID_NAME, UserInfoCache.getInstance(BaseApplication.getInstance()).getLoginInfo().getUser().getSessionId()).build();
}
return new Request.Builder().url(url).build();
}
/**
* post 请求
*
* @param url
* @param params
* @return
*/
public Request postRequest(String url, Map<String, String> params) {
FormEncodingBuilder builder = new FormEncodingBuilder();
if (params != null) {
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
}
RequestBody requestBody = builder.build();
if (UserInfoCache.getInstance(BaseApplication.getInstance()).isLogin()) {
return new Request.Builder().url(url).addHeader(CommonConts.SESSION_ID_NAME, UserInfoCache.getInstance(BaseApplication.getInstance()).getLoginInfo().getUser().getSessionId()).post(requestBody).build();
}
return new Request.Builder().url(url).post(requestBody).build();
}
}

官方文档:OkHttpWiki

坚持原创技术分享,您的支持将鼓励我继续创作!