基于Okhttp的网络通信的初步认识
OkHttp
在Android开发中,有多种网络通信的方式,包括且不限于:HttpUrlConnection,Android-Async-Http, Volley,Okhttp等.其中,Okhttp因为其接口简单易用,在底层实现上也自成一派,受到广大开发人员的欢迎.
Okhttp是由Square公司开发的,该公司同时还有Retrofit.
使用OkHttp
在使用Okhttp前我们需要在build.gradle文件中添加依赖.
dependencies{
implementation("com.squareup.okhttp3:okhttp:4.0.1")//4.0.1是目前的最新版本,2019年8月3日.
}
在添加完依赖后resync一下就可以使用了.
Okhttp的使用十分简单
OkhttpClient client = new OkhttpClient();//创建一个Okhttp的实例
Request request = new Request
.url("http://www.baidu.com")//通过url()方法设置目标的网络地址
.build(); //完成Request创建
Response response = client.newCall(request).excecute();
//通过Client的newCall()创建一个call对象,并通过execute()方法发送请求并返回数据
//execute()方法是同步请求,使用异步请求应该通过enqueue()方法
返回的response就是服务器返回的对象了。
在返回的response中可以获取到需要的数据。如果我们需要得到具体的返回对象,可以通过如下写法来获取
String responseData=response.body().string();//这里直接是string()方法,不是toString()
如果需要添加header或者发起post则时如下
//发起POST
RequestBody requestBody=new FormBody.builder()
.add("key","value").build;//新建requestbody
Request request =new Request.Builder().url("www.baidu.com")
.post(requestBody).build();//使用post()发送
//添加header
Request request = new Request.Builder().url("www.baidu.com")
.addheader("key1","value1")//使用addheader()时,输入的key值如果相同,会增加一个新的value
.header("key2","value2")//使用header()时,如果出现相同的key,会将原有的value删去替换成新的key.
.build();
代码如下
package com.example.okhttptest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.internal.http2.Header;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView textView;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.textview);
button=findViewById(R.id.button1);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view.getId()==R.id.button1){
sendRequestWithOkhttp(); //通过OkHttp进行网络通信
}
}
private void sendRequestWithOkhttp(){
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url(getResources().getString(R.string.url))
.header("avoidVerify","1").build();
client.newCall(request).enqueue(new Callback() { //异步请求
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
showResponse(e.getMessage());
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String responsebody=response.body().string();
showResponse(responsebody);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
//跳回主线程更新UI
protected void showResponse(final String string){
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(string);
}
});
}
}
UI界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="press here"
android:textSize="40sp"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/textview"
/>
</ScrollView>
</LinearLayout>
最后不要忘了声明权限
<uses-permission android:name="android.permission.INTERNET"/>