OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZip压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。
OkHttp官网地址:http://square.github.io/okhttp/ OkHttp GitHub地址:https://github.com/square/okhttp
Eclipse直接导入jar依赖就行,对应最新的okhttp下载地址,另外okhttp内部依赖okio,最新的okio下载地址
AndroidStudio配置方法,直接在build.gradle中添加如下代码
compile 'com.squareup.okhttp3:okhttp:3.6.0'或者通过选中项目,右键里选择“Open Module Settings”,然后在下图里选择搜索okhttp即可,会自动在build.gradle里添加上上面那行
配置完成后我们就来看看简单的使用
3、简单使用
3.1 利用OkHttp发送get请求
同步方法execute,代码如下
public void okHttpGetByExecute() { OkHttpClient okHttpClient = OkhttpUtis.getOkHttpClientInstace(); Request request = new Request.Builder().url("http://blog.csdn.net/yin1031468524"). build(); //当然你也可以通过Request.Builder设置更多的参数比如:header、method等 //new Request.Builder().addHeader(name ,value) try { Response response = okHttpClient.newCall(request).execute(); if (response.isSuccessful()) { mHandler.sendMessage(mHandler.obtainMessage()); //r注意esponse.body().toString打印的是Responsebody对象 Log.d(TAG, response.body().string()); } else { throw new IOException("Unexpected code " + response); } } catch (IOException e) { Log.d(TAG, " test1 e :" + e.toString()); e.PRintStackTrace(); } }利用enqueue异步访问,代码如下public void okHttpGetByEnqueue() { OkHttpClient okHttpClient = OkhttpUtis.getOkHttpClientInstace(); Request request = new Request.Builder().url("http://blog.csdn.net/yin1031468524"). build(); //当然你也可以通过Request.Builder设置更多的参数比如:header、method等 //new Request.Builder().addHeader(name ,value) Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(TAG, e.toString()); } @Override public void onResponse(Call call, Response response) throws IOException { mHandler.sendMessage(mHandler.obtainMessage()); //r注意esponse.body().toString打印的是Responsebody对象 Log.d(TAG, response.body().string()); } }); }以上就是利用okhttp实现的两种get访问方式,简单总结下,分三步1.构造一个Request对象,参数最起码有个url,当然你可以通过Request.Builder设置更多的参数比如:header、method等。
2.通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute(),enqueue(),cancel()等方法
3.调用Call对象的execute()或enqueue()发起get请求
onResponse回调的参数是response,一般情况下,获得返回的字符串,可以通过response.body().string();获得返回的二进制字节数组,则调用response.body().bytes();需要返回的inputStream,则调用response.body().byteStream(),
enqueue()和execute()区别:
同步时execute()返回Response就可以更新UI,异步时在callback的onResponse触发时可更新UI。同步方法会阻塞线程,不要在UI线程使用
3.2 利用OkHttp发送post请求
通过post发起请求和get类似,只是在post方法里需要传入一个RequestBody,可以通过FormBody键值对方式创建请求体,也可以通过json数据,具体使用方法参见下面代码:public void okHttpPosyByEnqueue(String json) { OkHttpClient okHttpClient = OkhttpUtis.getOkHttpClientInstace(); //1.通过键值对添加RequestBody start// FormBody.Builder builder = new FormBody.Builder();// RequestBody requestBody = builder.add("username", "jason").add("passWord", "123456").build(); //1.通过键值对添加RequestBody end //2.通过json提交数据 MediaType parse = MediaType.parse("application/json; charset=utf-8"); RequestBody requestBody = RequestBody.create(parse, json); Request request = new Request.Builder().url("http://blog.csdn.net/yin1031468524").post(requestBody).build(); //当然你也可以通过Request.Builder设置更多的参数比如:header、method等 //new Request.Builder().addHeader(name ,value) Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(TAG, e.toString()); } @Override public void onResponse(Call call, Response response) throws IOException { //r注意esponse.body().toString打印的是Responsebody对象 Log.d(TAG, response.body().string()); } }); }
新闻热点
疑难解答