get请求
可直接看后面的解释
可仔细去看看着文章:https://www.jianshu.com/p/9aa969dd1b4d
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/contentTv"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package com.example.okhttp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
private TextView contentTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentTv=findViewById(R.id.contentTv);
//1、拿到OKHttpClient对象
OkHttpClient okHttpClient=new OkHttpClient();
//2、构造Request对象
Request request= new Request.Builder() //这里我们采用建造者模式和链式调用指明是进行Get请求,
//并传入Get请求的地址
.get()
.url("https://www.baidu.com")
.build();
//3、将Request封装为Call
Call call=okHttpClient.newCall(request);
//4、根据需要调用同步或者异步请求方法
//同步调用,一般不用同步,因为同步调用会阻塞主线程,一般不适用
// try {
// Response response=call.execute();
// } catch (IOException e) {
// e.printStackTrace();
// }
//异步调用
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) { //未收到服务器返回的结果
Toast.makeText(MainActivity.this, "get failed", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException { //从onResponse中获得了返回的json数据
final String res=response.body().string();
runOnUiThread(new Runnable() { //异步调用的回调函数是在子线程,我们不能在子线程更新UI,需要借助于runOnUiThread()方法或者Handler来处理
@Override
public void run() {
contentTv.setText(res);
}
});
}
});
}
}
注意,在准备工作做好了才能运行成功
运行结果:
相关解释:
使用OkHttp进行
Get
请求只需要四步即可完成。
1 . 拿到OkHttpClient对象
OkHttpClient client = new OkHttpClient();
//OkTttp是网络请求框架,Client是客户,所以是客户网络请求框架
2 . 构造Request对象
创建一个请求的建造者让他返回给请求对象
Request request = new Request.Builder()
.get()
.url("https:www.baidu.com")
.build();
//request 请求 Builder建造者
这里我们采用建造者模式和链式调用指明是进行Get请求,并传入Get请求的地址
如果我们需要在get请求时传递参数,我们可以以下面的方式将参数拼接在url之后
"https:www.baidu.com?username=admin&password=admin"
//注意这里是加的一个&
3 . 将Request封装为Call
Call call = client.newCall(request);
4 . 根据需要调用同步或者异步请求方法
//同步调用,返回Response,会抛出IO异常
Response response = call.execute();
//异步调用,并设置回调函数
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(OkHttpActivity.this, "get failed", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String res = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
contentTv.setText(res);
}
});
}
});
第四步有一些需要注意的地方
- 同步调用会阻塞主线程,一般不适用
- 异步调用的回调函数是在子线程,我们不能在子线程更新UI,需要借助于
runOnUiThread()
方法或者Handler
来处理
是不是以为上面就结束了,对的,OkHttp的Get请求步骤就这么4步,但是当你试图打开应用加载数据,可是发现并没有加载到数据,这是一个简单但是我们常犯的错误.
在AndroidManifest.xml中加入联网权限
<uses-permission android:name="android.permission.INTERNET" />