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,List params){ returnurl+"?"+formatParams(params); } /** *为HttpGet的url方便的添加1个namevalue参数。 *@paramurl *@paramname *@paramvalue *@return */ publicstaticStringattachHttpGetParam(Stringurl,Stringname,Stringvalue){ returnurl+"?"+name+"="+value; } }
总结
通过上面的例子我们可以发现,OkHttp在很多时候使用都是很方便的,而且很多代码也有重复,因此特地整理了下面的工具类。