学习进度条71

第一步,需要创建一个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()

原文地址:https://www.cnblogs.com/hhw12345/p/14910643.html