Android OkHttp基本使用详解
Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient。
尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。
OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。
使用范围
OkHttp支持Android2.3及其以上版本。
对于Java,JDK1.7以上。
基本使用
HTTPGET
OkHttpClientclient=newOkHttpClient();
Stringrun(Stringurl)throwsIOException{
Requestrequest=newRequest.Builder().url(url).build();
Responseresponse=client.newCall(request).execute();
if(response.isSuccessful()){
returnresponse.body().string();
}else{
thrownewIOException("Unexpectedcode"+response);
}
}
Request是OkHttp中访问的请求,Builder是辅助类。Response即OkHttp中的响应。
Response类:
publicbooleanisSuccessful() Returnstrueifthecodeisin[200..300),whichmeanstherequestwassuccessfullyreceived,understood,andaccepted.
response.body()返回ResponseBody类
可以方便的获取string
publicfinalStringstring()throwsIOException ReturnstheresponseasastringdecodedwiththecharsetoftheContent-Typeheader.Ifthatheaderiseitherabsentorlacksacharset,thiswillattempttodecodetheresponsebodyasUTF-8. Throws: IOException
当然也能获取到流的形式:
publicfinalInputStreambyteStream()
HTTPPOST
POST提交Json数据
publicstaticfinalMediaTypeJSON=MediaType.parse("application/json;charset=utf-8");
OkHttpClientclient=newOkHttpClient();
Stringpost(Stringurl,Stringjson)throwsIOException{
RequestBodybody=RequestBody.create(JSON,json);
Requestrequest=newRequest.Builder()
.url(url)
.post(body)
.build();
Responseresponse=client.newCall(request).execute();
f(response.isSuccessful()){
returnresponse.body().string();
}else{
thrownewIOException("Unexpectedcode"+response);
}
}
使用Request的post方法来提交请求体RequestBody
POST提交键值对
很多时候我们会需要通过POST方式把键值对数据传送到服务器。OkHttp提供了很方便的方式来做这件事情。
OkHttpClientclient=newOkHttpClient();
Stringpost(Stringurl,Stringjson)throwsIOException{
RequestBodyformBody=newFormEncodingBuilder()
.add("platform","android")
.add("name","bug")
.add("subject","XXXXXXXXXXXXXXX")
.build();
Requestrequest=newRequest.Builder()
.url(url)
.post(body)
.build();
Responseresponse=client.newCall(request).execute();
if(response.isSuccessful()){
returnresponse.body().string();
}else{
thrownewIOException("Unexpectedcode"+response);
}
}
注意:
- OkHttp官方文档并不建议我们创建多个OkHttpClient,因此全局使用一个。如果有需要,可以使用clone方法,再进行自定义。这点在后面的高级教程里会提到。
- enqueue为OkHttp提供的异步方法,入门教程中并没有提到,后面的高级教程里会有解释。
importjava.io.IOException;
importjava.util.List;
importjava.util.concurrent.TimeUnit;
importorg.apache.http.client.utils.URLEncodedUtils;
importorg.apache.http.message.BasicNameValuePair;
importcn.wiz.sdk.constant.WizConstant;
importcom.squareup.okhttp.Callback;
importcom.squareup.okhttp.OkHttpClient;
importcom.squareup.okhttp.Request;
importcom.squareup.okhttp.Response;
publicclassOkHttpUtil{
privatestaticfinalOkHttpClientmOkHttpClient=newOkHttpClient();
static{
mOkHttpClient.setConnectTimeout(30,TimeUnit.SECONDS);
}
/**
*该不会开启异步线程。
*@paramrequest
*@return
*@throwsIOException
*/
publicstaticResponseexecute(Requestrequest)throwsIOException{
returnmOkHttpClient.newCall(request).execute();
}
/**
*开启异步线程访问网络
*@paramrequest
*@paramresponseCallback
*/
publicstaticvoidenqueue(Requestrequest,CallbackresponseCallback){
mOkHttpClient.newCall(request).enqueue(responseCallback);
}
/**
*开启异步线程访问网络,且不在意返回结果(实现空callback)
*@paramrequest
*/
publicstaticvoidenqueue(Requestrequest){
mOkHttpClient.newCall(request).enqueue(newCallback(){
@Override
publicvoidonResponse(Responsearg0)throwsIOException{
}
@Override
publicvoidonFailure(Requestarg0,IOExceptionarg1){
}
});
}
publicstaticStringgetStringFromServer(Stringurl)throwsIOException{
Requestrequest=newRequest.Builder().url(url).build();
Responseresponse=execute(request);
if(response.isSuccessful()){
StringresponseUrl=response.body().string();
returnresponseUrl;
}else{
thrownewIOException("Unexpectedcode"+response);
}
}
privatestaticfinalStringCHARSET_NAME="UTF-8";
/**
*这里使用了HttpClinet的API。只是为了方便
*@paramparams
*@return
*/
publicstaticStringformatParams(Listparams){
returnURLEncodedUtils.format(params,CHARSET_NAME);
}
/**
*为HttpGet的url方便的添加多个namevalue参数。
*@paramurl
*@paramparams
*@return
*/
publicstaticStringattachHttpGetParams(Stringurl,Listparams){
returnurl+"?"+formatParams(params);
}
/**
*为HttpGet的url方便的添加1个namevalue参数。
*@paramurl
*@paramname
*@paramvalue
*@return
*/
publicstaticStringattachHttpGetParam(Stringurl,Stringname,Stringvalue){
returnurl+"?"+name+"="+value;
}
}
总结
通过上面的例子我们可以发现,OkHttp在很多时候使用都是很方便的,而且很多代码也有重复,因此特地整理了下面的工具类。