OkHttp介绍
OkHttp是由鼎鼎大名的Square公司开发的,这个公司在开源事业上面贡献良多,除了OkHttp之外,还开发了像Picasso、Retrofit等著名的开源项目。OkHttp不仅在接口封装上面做得简单易用,就连在底层实现上也是自成一派,比起原生的HttpURLConnection,可以说是有过之无不及,现在已经成了广大Android开发者首选的网络通信库。OkHttp的项目地址
注意:
OkHttp最新版本需要在Android5.0以上版本也就是API水平要在21以上才可使用,否则就会一直报Error: Static interface methods are only supported starting with Android N (--min-api 24): java.util.List okhttp3.Dns.lambda$static$0(java.lang.String)
我当时搞了半天,最后换了一个API为25的,然后再搞搞就好了,所以在这里提醒一下,下面是来自OkHttp的GitHub说明
Requirements
OkHttp works on Android 5.0+ (API level 21+) and on Java 8+.
OkHttp has one library dependency on Okio, a small library for high-performance I/O. It works with >either Okio 1.x (implemented in Java) or Okio 2.x (upgraded to Kotlin).
We highly recommend you keep OkHttp up-to-date. As with auto-updating web browsers, staying >current with HTTPS clients is an important defense against potential security problems. We track the >dynamic TLS ecosystem and adjust OkHttp to improve connectivity and security.
OkHttp uses your platform’s built-in TLS implementation. On Java platforms OkHttp also supports >Conscrypt, which integrates BoringSSL with Java. OkHttp will use Conscrypt if it is the first security >provider:
Security.insertProviderAt(Conscrypt.newProvider(), 1);
The OkHttp 3.12.x branch supports Android 2.3+ (API level 9+) and Java 7+. These platforms lack >support for TLS 1.2 and should not be used. But because upgrading is difficult we will backport critical >fixes to the 3.12.x branch through December 31, 2020.
基本使用
可以去参考下OkHttp的官网
发送get请求
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
发送post请求
public static final MediaType JSON
= MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
使用示例(get请求)
在使用OkHttp之前,我们需要在项目中添加OkHttp的依赖。在build.gradle的dependencies中添加以下这个依赖。
implementation("com.squareup.okhttp3:okhttp:3.14.1")
同时还需要在还要在build.gradle中defaultConfig中加入
compileOptions {
targetCompatibility = "8"
sourceCompatibility = "8"
}
为什么要添加呢?因为我要进行编译在虚拟机上跑的时候,一直通不过Run tasks,它一直报Error: Static interface methods are only supported starting with Android N (--min-api 24): okhttp3.Request okhttp3.Authenticator.lambda$static$0(okhttp3.Route, okhttp3.Response)
,后面我查了一下,这是因为java8才支持静态接口方法的原因,所以可以通过在app的build.gradle文件中配置使用java8编译
然后就可以正常玩耍了,我这里是参考《第一行代码》关于OkHttp的例子来讲的(因为我刚好也在学,嘻嘻)。
首先在activity_main.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">
<Button
android:id="@+id/send_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Request"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/response_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
首先这里使用的线性布局然后设置了垂直显示,LinearLayout中很简单,一个Button来发送请求,一个ScrollView来进行显示返回数据。
然后修改MainActivity中的代码,使用了OkHttp之后,发送请求真滴比原生的HttpURLConnection简单好多~~
package com.ddu.test_network;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView responseText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sendRequest = findViewById(R.id.send_request);
responseText = findViewById(R.id.response_text);
sendRequest.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.send_request) {
sendRequestWithHttpURLConnection();
}
}
private void sendRequestWithHttpURLConnection() {
// 开启线程来发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
try {
//首先创建一个OkHttpClient的实例
OkHttpClient client = new OkHttpClient();
//如果想要发一条HTTP请求,就需要创建一个Request对象
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
//调用OkHttpClient的newCall()方法来创建一个Call对象
//调用他的execute()方法来发送并获取服务器返回的数据
Response response = client.newCall(request).execute();
String responseData = response.body().string();
showResponse(responseData);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 将数据显示到界面上
*
* @param response 要显示的数据
*/
private void showResponse(final String response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 在这里进行UI操作,将结果显示到界面上
responseText.setText(response);
}
});
}
}
然后需要在AndroidManifest中添加权限
<uses-permission android:name="android.permission.INTERNET" />
,具体如下所示
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ddu.test_network">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
效果
点击按钮后,返回数据
tip: 有需要代码的可以去我的码云去下载