一、简介
OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于http的 文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免 重复的网络请求,支持使用连接池来降低响应延迟问题。
OkHttp丌仅在接口封装上面做得简单易用,就连在底层实现上也是自成一派,比 起原生的HttpURLConnection,可以说是有过之而无不及,现在已经成为广大 Android开发者首选的网络通信库。
OkHttp的项目主页地址是:https://github.com/square/okhttp
注意: OkHttp有2.0版本和3.0的版本,目前常用的是OkHttp3
二、OkHttp的基本用法
在使用OkHttp之前,我们需要先在项目中添加OkHttp库的依赖。编辑 app/build.gradle文件在dependencies闭包中添加如下内容:
1、步骤1:创建OkHttpClient类的实例
OkHttpClient client = new OkHttpClient();
2、步骤2:创建Request对象(并设置目标地址、请求方式等)
3、步骤3:调用newCall()方法来创建call对象
Call call = client.newCall(request);
4、步骤4:发送请求并获取服务器返回的数据(同步、异步)
同步请求:执行请求的操作是阻塞式,直到HTTP响应返回。如果当前 OkHttpClient已经执行了一个同步任务,如果这个任务没有释放锁,那么新发起的请 求将被阻塞,直到当前任务释放锁。同步请求对应OkHttp中的execute()方法。
异步请求:执行的是非阻塞式请求,它的执行结果一般都是通过接口回调的方式告 知调用者。同一时刻可以发起多个请求,因为异步请求每一个都是在一个独立的线程, 由线程队列管理。异步请求对应OkHttp中的enqueue()方法。
注意 contentType主要包括以下几种数据格式:
MediaType 常见的数据格式 数据格式 说明 multipart/form-data 表单形式提交,既可以上传键值对,也可以上传文件 application/x-www-from-urlencoded 以键值对的数据格式提交 raw 选择 text,则请求头是: text/plain
选择 javascript,则请求头是: application/javascript
选择 json,则请求头是: application/json
选择 html,则请求头是: text/html
选择 application/xml,则请求头是: application/xml
binary 相当于Content-Type:application/octet-stream,
只可以上传二进制数 据,通常用来上传文件,
由于没有键值,一次只能上传一个文件
5、举例1:POST方式提交表单
三、代码详解
1、layout1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2、activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
3、MainActivity.java
package com.example.zsokhttp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
//定义TextView对象
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout1);
//将TextView对象和布局文件中的控件进行关联
textView = findViewById(R.id.tv);
//1.创建OkHttpClient类的实例
OkHttpClient client = new OkHttpClient();
//2.创建Request对象,并设置目标网络地址、请求方式等
Request request = new Request.Builder()
.url("https://www.baidu.com")
.get()
.build();
//3.通过前面定义的OkHttpClient对象来调用newCall()方法创建call对象
Call call = client.newCall(request);
//4.发起请求并获取服务器返回的数据(异步)
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
//服务器访问失败时的处理操作
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//接受并处理从服务器返回的数据
String responseData = response.body().string();
showResponse(responseData);
}
});
}
private void showResponse(final String responseData) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//在这里进行UI操作,将结果显示到界面上
textView.setText(responseData);
}
});
}
}