Android学习笔记之——OkHttp的使用
书不尽言,言不尽意,他山之石,可以攻玉。这次的博客我们来探讨下安卓开发中OkHttp的使用,您宝贵的意见可以让我明白自己的不足之处,并加以改正,在此谢谢各位了!
博客将涉及到以下几点:
- 为什么要使用OkHttp
- 如何使用OkHttp
那么废话不多说,直接开始吧
1、为什么要使用OkHttp
我们知道在安卓开发中要发送HTTP请求有个原生的方法HttpURLConnection,那么为什么还要使用第三方的OkHttp呢?我们先来了解下OkHttp,OkHttp是由Square公司开发的开源项目,地址为点击打开链接。OkHttp在接口封装上非常简单易用,比起原生的HttpURLConnection,真的是方便的多了,到底有多方便呢?我们来做个对比,分别使用HttpURLConnection和OkHttp访问点击打开链接,看看他们的代码差异。
首先自然是创建个布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zby.bloghttp.MainActivity">
<Button
android:id="@+id/btn_sendRequest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送网络请求"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_response"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</ScrollView>
</LinearLayout>
很简单的布局,用一个按钮发送请求后,将请求的结果显示在TextView中,由于请求的文本可能过长,所以将TextView包裹在ScrollView里进行滚动。
布局好了,我们就来修改下MainActivity里的内容,首先试试用HttpUrlConnection请求网络
public class MainActivity extends AppCompatActivity {
private Button btn_sendResqust;
private TextView tv_response;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_sendResqust = (Button) findViewById(R.id.btn_sendRequest);
tv_response = (TextView) findViewById(R.id.tv_response);
btn_sendResqust.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendRequestWithHttpUrlConnection();//使用HttpUrlConnection访问
}
});
}
}
将控件初始化,给按钮绑定监听事件让他处理一个自定义的sendRequestWithHttpUrlConnection方法,接着我们看看这个方法里的内容
private void sendRequestWithHttpUrlConnection() {
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url=new URL("https://raw.githubusercontent.com/square/okhttp/master/LICENSE.txt");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
InputStream in=connection.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
final StringBuilder response =new StringBuilder();
String line=null;
while ((line=reader.readLine())!=null){
response.append(line);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
tv_response.setText(response);
}
});
reader.close();
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
很常用的写法,开启线程获取URL,获取HttpURLConnection,设置connection属性,通过connection把内容传给IO流处理,再更新TextView的UI(注意 UI不能在子线程更新,所以使用了runOnUiThread方法回到主线程更新UI)。
最后,因为要访问网络,所以别忘了获取网络权限
<uses-permission android:name="android.permission.INTERNET"/>
现在运行下程序并点击按钮,结果如下
毫无意外的获取到了数据并展现了出来,显然HttpURLConnection已经很好用了,但HttpURLConnection不是我们这次关注的目标,所以我们现在来对比下OkHttp是如何实现同样的功能的。
使用第三方库自然要先在Android studio中进行配置,如下
compile 'com.squareup.okhttp3:okhttp:3.10.0'
配置完成后,修改MainActivity中按钮的点击事件
btn_sendResqust.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//sendRequestWithHttpUrlConnection();
sendRequestWithOkHttp();
}
});
这次我们自定义了sendRequestWithOkHttp方法,用此方法来使用OkHttp获取请求,现在我们来看看这个方法的具体内容
private void sendRequestWithOkHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client=new OkHttpClient();
Request.Builder builder=new Request.Builder();
builder.url("https://raw.githubusercontent.com/square/okhttp/master/LICENSE.txt");
Request request=builder.build();
Response response=client.newCall(request).execute();
final String responseData=response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
tv_response.setText(responseData);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
初看一眼,代码量少了很多,我们先不详讲,首先看下运行结果,如下:
同样获取到了请求,并更新了UI,同时我们发现了个额外的惊喜,对比上图,那就是OkHttp帮我们把文本缩进也做了!
写到这你可能已经感觉到OkHttp的优点了,但是OkHttp是怎么做到的呢?你现在或许还一脸懵逼,但没关系,接下来,我们将详细了解下OkHttp.那么让我们进入第二步:如何使用OkHttp。
2、如何使用OkHttp
OkHttp的基本用法
要使用OkHttp,首先要创建一个OkHttpClient实例,如下:
OkHttpClient client=new OkHttpClient();
拿到OkHttpClient实例后,要想发起一条HTTP请求,就要创建一个Request 对象,但是OkHttp没法直接构建Request,通常都是基于构建者模式,借助Request.Builder工具类构建出Request.Builder对象,再通过builder的url方法,通过字符串形式请求到url地址,再通过builder.build()方法就能够获得Request对象了。我们看下之前那段代码这三行:
Request.Builder builder=new Request.Builder();
builder.url("https://raw.githubusercontent.com/square/okhttp/master/LICENSE.txt");
Request request=builder.build();
就这样拿到Request对象后,我们就可以通过client.newCall(request)方法,告诉client我们的请求就是这个request,然后使用client.newCall(request)方法,就会给我们返回一个Call的对象,最后通过Call对象的execute()方法,就获取到了Response对象了,代码如下:
Response response=client.newCall(request).execute();
这里我用了连缀的写法将这些方法都写在了一行,这样服务器返回的数据我们就拿到了,由于我们要得到数据的具体内容来更新TextView的内容,所以使用以下写法来得到内容:
final String responseData=response.body().string();
这样的话OkHttp的基本用法就介绍完了,但是或许你还有些疑问Response中有哪些内容,所以接下来我将会介绍下Response
Response
Response包含三个部分:返回码code、响应头header、响应体body
我们先来获取下Response看下里面的内容:
这里我对布局做了改变,新增加了个按钮用于获取Response内容,并在按钮的点击事件了写了个getResponseContent的方法。
btn_responseContent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getResponseContent();
}
});
接着我们看看getResponseContent方法的具体内容:
private void getResponseContent() {
new Thread(new Runnable() {
@Override
public void run() {
Request.Builder builder = new Request.Builder();
builder.url("https://raw.githubusercontent.com/square/okhttp/master/LICENSE.txt");
Request request = builder.build();
Call call = mClient.newCall(request);
try {
Response response=call.execute();
int code = response.code();
Headers headers = response.headers();
String body = response.body().toString();
final StringBuilder responseDate = new StringBuilder();
responseDate.append("code:" + code);
responseDate.append("\nheaders:" + headers);
responseDate.append("\nbody:" + body);
runOnUiThread(new Runnable() {
@Override
public void run() {
tv_response.setText(responseDate.toString());
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
运行下结果,点击获取RESPONSE内容:
运行结果中显示的内容就是Response的所有内容,下面我们进行下分析:
响应体body我们前面已经看到了,就是之前TextView里的一大串文字。
返回码code不用多说,这里返回的是200,代表的请求成功,常见的有:
200 ok 请求已成功,请求所希望的响应头或数据体将随此响应返回。
202 Accepted 服务器已经接受请求,但尚未处理。
404 Not Found请求所需要的资源为在服务器上被发现。
501 Not Implemented服务器不支持当前请求所需要的某个功能。
505 HTTP Version Not Supported服务器不支持,或者拒绝支持在请求中使用的HTTP版本。
具体的其他返回码可以参考其他资料。
而响应头headers,我们通过运行结果可以看出,他是由一堆keys和values组成的键值对。当客服端有具体的需要时,就能通过get它的key,获取到具体的值来进行具体的操作了,
好了,这次的学习笔记想写的就写到这了,OkHttp还有很多复杂的操作,在后续会进行补充,感谢您花费宝贵的时间进行观看,期待有缘再见!