本文主要写一下okhttp库的使用小结。
OkHttp库是一个支持HTTP协议和HTTP/2协议的java版本客户端程序。是替代httpclient的库,Okhttp目前据说已经时安卓标配。不过我没做过安卓,这里仅仅解释基本的功能。我自己用的时候确实觉得Okhttp用起来很方便,因为第一次用第三方库,感觉比java自带的要好用的多。
Okhttp主要类
Okhttp主要的类并不多打开doc基本上就一列就结束了。常用的也就不多的几个。我只说下我用到的这个几个,没用到的部分就不多说了。
- OkHttpClient 用来构建Client。
- Httpurl 用来构建url。
- Request 用来构建request
- Response 用来构建response
- Header 用来构建或者接受request或者response的头信息
- Body 用来构建或者接受request或者response的体信息
- Cookie 用于储存Cookie信息。
- Call 表示以及构建好了的request,可以调用excute执行request
基本使用方法和步骤
用起来其实很简单。除了最后的call以外之前的所有内容都有一个对于的Builder类型。使用方法类似于StringBuilder。基本的格式如:
HttpUrl url = new HttpUrl.Builder()//创建一个对象的.Builder对象。
.add*() //对.Builder对象添加相应的字段。
.add*()
...
.builder();//完成构建后调用builder将.Builder对象转换成构建好了的HttpUrl之类的对象。
//对于已经构建好了对象通常也可以重新构件
url = url.newBuilder()
.add*() //对.Builder对象添加相应的字段。
.add*()
...
.builder();//完成构建后调用builder将.Builder对象转换成构建好了的HttpUrl之类的对象。
对于大多数的请求和应答的获得步骤如下
OkHttpClient client = new OkHttpClient();
HttpUrl url = new HttpUrl().Builder()
.add*(*)
.build();
Header head = new Header().Builder()
.add*(*)
.build();
/*
RequestBody body = new FormaBody.Builder()//如果是post需要加这部分。
.add*(*)
.build();
*/
Request re = new Request().Builder()
.url(url)
.headers(headers)
.post(body)//如果时post的话需要加这样一句
.build();
Call ca = client.newCall(re);
try (Response res = ca.excute()){
Header reshead = res.headers();
ResponseBody resbody = res.body();
}catch//或者其他
几点需要注意的说明
OkhttpClient:
这个类有自己的连接池和线程池,如果希望得到最佳的性能,最好只创建一个OkhttpClient,然后用它来调用所有的请求和接受响应。当然OkhttpClient也有Builder类,你可以用它定制自己的类。
通常来说OkhttpClient会自动关闭闲置的资源,但是如果你需要尽快关闭也可以调用shutdown。有多种方式具体参见reference和源码。
Responsebody
这个类是需要自己关闭的,主要原因应该是它包含有一个一次性的输入流,需要注意的是这个流是一次性的,一旦你调用了byteStream()、bytes()或者charStream() 、string()之类的方法,那就不可重用了。这一点需要尤其注意。
另外一个需要注意的一点时关于资源的关闭,由于关闭的主要时包含的输入流,如果流关闭了就将资源关闭了。所以以下资源的关闭是等同的,只要执行其中之一就可以了:
- Response.close()
- Response.body().close()
- Response.body().source().close()
- Response.body().charStream().close()
- Response.body().byteString().close()
- Response.body().bytes()
- Response.body().string()
另外这些都实现了AutoCloseable所以直接用带资源的try就行。