OKHTTP简介
okhttp是一个现代化的高效的http库。它能使资源下载的更快和节省带宽。
okttp的高效体现在:
* http/2 允许多个访问同一主机地址的请求共享同一个socket。
* 连接池减少了请求的延时
* 通过GZIP压缩下载时的文件大小
* Response缓存机制避免了网络请求完成时其它重复的请求。如果你配置了多个服务端的IP地址,网络请求失败时,okhttp能够切换ip地址进行重连。
okhttp的使用非常简单和方便,通过一些简单明了的配置就可。
okhttp访问网络的时候,支持同步阻塞调用和异步回调两种方式。
okhttp支持Android 2.3以上版本,jdk版本为1.7以上。
以上是来自官网的翻译。我想说的是如果想要体会到okhttp的好处,就要了解Android网络访问的过去。正所谓是—-“如果你认识从前的我,也许会原谅现在的我。”。哦不对!!!应该是—–如果你认识从前的我,肯定会喜欢上现在的我。
网络访问的远古时代
HTTPUrlConnection
以前自学的时候,网络上介绍Android的访问方式是这样:
private void testUrlConnect(){
String host = "http://blog.csdn.net/briblue";
try {
URL url = new URL(host);
HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();
if(httpconn.getResponseCode() == HttpURLConnection.HTTP_OK){
InputStreamReader isr = new InputStreamReader(
httpconn.getInputStream(),"utf-8");
int i = 0;
String content = "";
while((i = isr.read()) != -1){
content = content+(char)i;
}
isr.close();
final String info = content;
runOnUiThread(new Runnable() {
@Override
public void run() {
mInfo.setText(info);
}
});
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
HttpClient
后来他来了一个兄弟,著名的Apache HttpClient,它的访问方式如下:
private void testHttpClient(){
String host = "http://blog.csdn.net/briblue";
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(host);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
try {
String content = httpclient.execute(httpget,responseHandler);
System.out.println(content);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
httpclient.getConnectionManager().shutdown();
}
}
上面可以看到httpclient比httpurlclient使用起来还是方便很多。
Volley
再后来谷歌发布了一个重要的http库Volley。当时我还专门研究过,并应用到了自己的项目代码,这里不做简介。它的底层可以配置使用httpclient和httpurlconnection,当然也可以配置我们今天的主角okhttp.
volley的优势是小而频繁的网络请求,volley本身的字面意思就是万箭齐发。
volley的缺点不适合上传和下载的操作。
android api 23删除了httpclient
Android6.0删除了httpclient的相关包,而推荐使用HttpUrlConnection.这个我不做评价,可能是HttpUrlConnection的性能更高吧。但HttpUrlConnection真心不好用,需要封装,除了Volley外,okhttp是个不错的选择,下面我们开始讲okhttp的知识
OKHttp基本使用
前面的文章有介绍了HTTPUrlConnection与HttpClient的基本使用,这里开始介绍OKHttp如何编写代码。
okhttp的包的导入
在AndroidStudio中在依赖中引入如下:
dependencies {
......
compile 'com.squareup.okhttp3:okhttp:3.4.1'
.....
}
如果是Eclipse,则去官网下载jar包。
点击这里
GET
下面是一个简单的get请求。
private void testGet() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient mOkClient = new OkHttpClient();
final Request request = new Request.Builder().url("http://blog.csdn.net/briblue").build();
final Response response = mOkClient.newCall(request).execute();
final String info = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
mInfo.setText(info);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
整个流程是
1. 创建OkHttpClient对象。
2. 创建Request对象
3. 通过OkHttpClient对象调用请求,并得到Response.
4. 得到Response的信息并进行相应的业务处理。
可以看到非常的简单
post
在这里多说一句,因为没有找到网上免费的可以进行post请求的api,所以自己用Php写了一个简单的接受post请求的页面。
用的环境是网络下下载的Phpnow套件,这是个绿色小巧的Php开发环境,下载解压到一个没有中文字符路径下,然后在package/htdocs目录下编写自己的代码就可以了。我编写了一个简单的testpost.php
<?php
$post = $GLOBALS['HTTP_RAW_POST_DATA'];
//打印传过来的post数据
echo "hello you send a message:".$post;
我原本是想解析json数据的,后来发现这玩意没有这扩展。所以只得打印传过来的json数据。大家想让服务端更牛x一点,可以下载wamp套件。它同样是一个Php开发运行环境,但功能丰富得多。
好了,android的如何用okhttp发送post请求?
private void testPost() {
new Thread(new Runnable() {
@Override
public void run() {
String host = "http://172.26.133.50//testpost.php";
final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String json = "{\"username\":\"frank\",sex:\"man\"}";
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(host)
.post(body)
.build();
Response response = null;
try {
response = client.newCall(request).execute();
final String info = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
mInfo.setText(info);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
运行的结果是界面上出现了如下字符串:
hello you send a message:{username:”frank”,sex:”man”}
同步与异步
前面示例讲得其实都是同步请求。因为它们用了execute()方法。
方法原型如下:
Response execute()
throws IOException
Invokes the request immediately, and blocks until the response can be processed or is in error.
如果要用异步的方式的话,就要用另外一个方法enqueue
方法原型如下:
void enqueue(Callback responseCallback)
Schedules the request to be executed at some point in the future.
异步发送请求
这里以get为例,改写上面的方法
private void asyncGet(){
final Request request =