OkHttp的主页地址:https://github.com/square/okhttp
添加依赖:
implementation("com.squareup.okhttp3:okhttp:4.9.0") implementation("com.squareup.okio:okio:2.8.0")
Okio库是前者的通信基础。
下面我们来看一下OkHttp的具体用法,首先
第一步,需要创建一个OkHttpClient的实例,如下所示:
OkHttpClient client = new OkHttpClient(); // 创建一个实例
第二步,如果你想要发起一条HTTP请求,就需要创建一个Request对象:
//发起一条HTTP请求 Request request = new Request.Builder().build();
当然,上述代码只是创建了一个空的Request对象,并没有什么实际的作用。我们可以在最终的build()方法之前连缀很多其他方法来丰富这个Request对象。比如,可以通过url()方法来设置目标的网络地址,如下:
Request request = new Request.Builder() .url("http://www.baidu.com") .build();
第三步,调用OkHttpClient的newCall()方法来创建一个call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据:
Response response = client.newCall(request).execute();
其中,Response对象就是服务器返回的数据了,我们可以使用如下写法来得到返回的具体内容:
String responseData = response.body().string();
如果是发起一条POST,我们需要先构建出一个Request Body对象来存放待提交的 参数,如下所示:
RequestBody requestBody = new FormBody.Builder() .add("username","admin") .add("password","123456") .build();
然后在Request.Builder中调用一下post()方法,并将RequestBody对象传入:
Request request = new Request.Builder() .url("http://baidu.com") .post(requestBody) .build();
接下来的操作就跟GET请求一样了,调用execute()方法来发送请求并获取服务器返回的数据即可。
接下来用一个完整的实例来演示上面的做法:
package com.example.webviewapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.TextView; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class MainActivity extends AppCompatActivity { private Button send,upload; private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); send = findViewById(R.id.send_request); txt = findViewById(R.id.response_txt); upload = findViewById(R.id.upload); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendRequestWithOkHttp(); } }); } private void sendRequestWithOkHttp() { new Thread(new Runnable() { @Override public void run() { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://www.baidu.com") .build(); try { Response response = client.newCall(request).execute(); String responseData = response.body().string(); showRequest(responseData); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void showRequest(final String responseData) { runOnUiThread(new Runnable() { @Override public void run() { txt.setText(responseData); } }); } }
这里很重要的知识点:
网络请求一定要用new Thread()开线程
在UI界面上显示,一定要用runOnUiThread()