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,已经成功拿到甜品类的菜谱了。