文章目录
- 一、前言
- 二、应用GET请求
- 1、添加权限AndroidManifest.xml
- 2、添加依赖okhttp3
- 3、编写界面文件activity_main.xml
- 4、编写Activity代码
- 5、效果
- 三、应用POST请求
- 四、okhttp3请求拦截器
一、前言
OkHttp是由Square公司开发的用于Java和Android的开源HTTP客户端库。它被广泛用于在Java和Android应用程序中进行HTTP请求。OkHttp支持HTTP/2、SPDY和HTTP/1.1协议,并具有连接池、透明gzip压缩和响应缓存等功能。
下面是一个简单的示例,演示了如何在Java中使用OkHttp进行GET请求:
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.example.com/data")
.build();
try {
Response response = client.newCall(request).execute();
String responseBody = response.body().string();
System.out.println(responseBody);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在这个例子中:
我们创建了一个OkHttpClient实例。
我们创建了一个指定了要请求的URL的Request对象。
我们使用client.newCall(request).execute()来同步执行请求。这个方法返回一个Response对象。
我们使用response.body().string()将响应主体提取为字符串。
二、应用GET请求
1、添加权限AndroidManifest.xml
这个文件包含了应用程序的各种信息,包括应用程序的包名、应用程序图标、应用程序需要的权限、应用程序中定义的组件(如活动、服务、广播接收器)、应用程序的版本信息等。
在AndroidManifest.xml文件中添加网络请求权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<!--网络请求权限-->
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
2、添加依赖okhttp3
根目录下的 build.gradle 文件通常用于配置整个项目的构建信息,例如项目的构建脚本版本、仓库地址、全局依赖项等。
在build.gradle中添加
dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// okhttp3 请求依赖
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
}
3、编写界面文件activity_main.xml
“activity_main.xml” 文件是 Android 应用程序中的一个布局文件,用于定义应用程序的主界面布局。它位于 “res/layout” 目录下。
<?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:id="@+id/content_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_test"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/but_test"
app:layout_constraintBottom_toBottomOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
4、编写Activity代码
创建MainActivity.java实现接口请求响应逻辑。
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "xxxxxxx";
private final OkHttpClient client = new OkHttpClient();
private TextView tvContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_test).setOnClickListener(this);
tvContent = findViewById(R.id.content_test);
}
// 点击后执行哪段代码
@Override
public void onClick(View v) {
okHttpAsynchronousDemo();
}
// okHttp同步方式请求
private void okHttpDemo() {
Request request = new Request.Builder()
.url("https://reqres.in/api/users?page=2")
.build();
tvContent.setText("同步请求中.......");
// 同步代码中必须开线程改变页面ui
new Thread(new Runnable() {
@Override
public void run() {
try {
// 发起请求并返回数据
Response response = client.newCall(request).execute();
String responseBody = response.body().string();
System.out.println(responseBody);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvContent.setText("同步请求成功" + responseBody);
}
});
} catch (IOException e) {
// 请求失败逻辑
e.printStackTrace();
}
}
}).start();
}
// okHttp异步方式请求
private void okHttpAsynchronousDemo() {
// 发起请求
Request request = new Request.Builder()
.url("https://reqres.in/api/users?page=2")
.build();
tvContent.setText("异步请求中.......");
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(@NotNull Call call, Response response) throws IOException {
// 处理请求成功的响应
String responseBody = response.body().string();
// 在这里处理响应数据
System.out.println(responseBody);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvContent.setText("异步请求成功" + responseBody);
}
});
}
@Override
public void onFailure(@NotNull Call call, IOException e) {
// 处理请求失败
e.printStackTrace();
}
});
}
// url 拼接方法
private void okHttpParams(){
HttpUrl.Builder builder = HttpUrl.parse("https://reqres.in/api/users").newBuilder();
builder.addQueryParameter("page", "2");
String url = builder.build().toString();
Log.d(TAG, url);
}
}
5、效果
三、应用POST请求
代码如下
// post请求
private void okHttpPostDemo(){
RequestBody body = new FormBody.Builder()
.add("name", "xxxx")
.add("job", "java")
.build();
// 发起请求
Request request = new Request.Builder()
.url("https://reqres.in/api/users")
.post(body).build();
tvContent.setText("异步请求中.......");
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
// 处理请求失败
e.printStackTrace();
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
// 处理请求成功的响应
String responseBody = response.body().string();
// 在这里处理响应数据
System.out.println(responseBody);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvContent.setText("异步请求成功" + responseBody);
}
});
}
});
}
效果图:
四、okhttp3请求拦截器
创建拦截器文件LoggingInterceptor.java
package com.example.myapplication;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class LoggingInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException{
long t1 = System.nanoTime();
System.out.println("拦截器开始时间" + t1);
Request request = chain.request();
Response response = chain.proceed(request);
long t2 = System.nanoTime();
System.out.println("拦截器结束时间" + t2);
return response;
}
}
在创建请求对象时调用
private final OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.build();
效果图: