Android——使用http访问网络——使用okHttp(向菜谱大全请求数据)

2.

在前一节中学习了HttpURLConnection的方法访问网络,现在来看看使用OKHttp访问网络吧。

在使用OKHttp之前,别忘了去dependencies闭包中添加如下依赖:

implementation 'com.squareup.okhttp3:okhttp:4.4.0'

接下来看看它的具体使用方法:

①创建OKHttpClient的实例;

OkHttpClient okHttpClient = new OkHttpClient();

 ②创建一个Request对象

Request request = new Request.Builder().build()

以上只是创建了一个空的Request对象,并无实际用途,在实际编程中,往往需要在build()方法前连缀很多其他方法来丰富这个Request()对象。

如可以设置目标的网络地址,HTTP请求方式等。

Request request = new Request.Builder()
  .url("http://www.baidu.com")
  .get() //默认为GET请求,可以省略
  .build();

③调用newCall()方法创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据。

Call call = okHttpClient.newCall(request);

而调用execute()方法来发送请求并获取服务器返回的数据有两种不同的方法:同步请求和异步请求。

同步GET请求:阻塞式请求,直到HTTP响应返回。同一时刻只能有一个任务发起。

     new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Response response = call.execute();
                    String responseData = response.body().string();
                } catch (IOException e) {
                    e.printStackTrace();
                }
     }

异步GET请求:非阻塞式请求,执行结果一般都是通过接口回调的方式告诉调用者,同一时刻可以发起多个请求。

                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();
                    }
                });

 实战:

   访问万维易源中的菜谱大全接口,获取到相应菜谱数据,并显示到屏幕上。

   布局代码同上一节,这里只贴逻辑代码:

同步GET请求:

package com.kotlin.activitystudy;

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.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OKHttpActivity extends AppCompatActivity {
    private Button btn_Request;
    private TextView responseText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp);
        btn_Request = findViewById(R.id.btn_sendRequest);
        responseText = findViewById(R.id.responseText);
        btn_Request.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendRequestWithHttpURLConnection();
            }
        });
    }

    private void sendRequestWithHttpURLConnection(){
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url(String.format("http://route.showapi.com/1164-1?showapi_appid=1137526&type= %s&showapi_sign=83017a04f5fc4a3bac716a087edb8553","蛋类"))
                .get() //默认为GET请求,可以省略
                .build();
        Call call = okHttpClient.newCall(request);
    //异步GET请求
new Thread(new Runnable() { @Override public void run() { try { Response response = call.execute(); String responseData = response.body().string(); showResponse(responseData); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void showResponse(String sb){ runOnUiThread(new Runnable() { //Android不允许在子线程中更新ui,这里使用异步消息处理机制中的工作原理更新ui @Override public void run() { responseText.setText(sb); } }); } }

运行结果如下:

 

 可以看到,已经成功获取了蛋类的菜谱。

异步GET请求:

package com.kotlin.activitystudy;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
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.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OKHttpActivity extends AppCompatActivity {
    private Button btn_Request;
    private TextView responseText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp);
        btn_Request = findViewById(R.id.btn_sendRequest);
        responseText = findViewById(R.id.responseText);
        btn_Request.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendRequestWithHttpURLConnection();
            }
        });
    }

    private void sendRequestWithHttpURLConnection(){
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url(String.format("http://route.showapi.com/1164-1?showapi_appid=1137526&type= %s&showapi_sign=83017a04f5fc4a3bac716a087edb8553","甜品"))
                .get() //默认为GET请求,可以省略
                .build();
        Call call = okHttpClient.newCall(request);
    //异步GET请求 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(String sb){ runOnUiThread(new Runnable() { //Android不允许在子线程中更新ui,这里使用异步消息处理机制中的工作原理更新ui @Override public void run() { responseText.setText(sb); } }); } }

运行如下:

 

OKK,已经成功拿到甜品类的菜谱了。

posted @ 2022-09-14 22:59  虞美人体重90  阅读(348)  评论(0编辑  收藏  举报