文章目录
- 一、前言
- 二、应用
- 1、添加权限AndroidManifest.xml
- 2、添加依赖okhttp3
- 3、编写界面文件activity_main.xml
- 4、编写Activity代码
- 三、效果
一、前言
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()将响应主体提取为字符串。
二、应用
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"/><applicationandroid: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"><TextViewandroid: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" /><Buttonandroid: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;@Overrideprotected 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);}// 点击后执行哪段代码@Overridepublic 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("同步请求中.......");// 同步代码中必须开线程改变页面uinew Thread(new Runnable() {@Overridepublic void run() {try {// 发起请求并返回数据Response response = client.newCall(request).execute();String responseBody = response.body().string();System.out.println(responseBody);runOnUiThread(new Runnable() {@Overridepublic 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() {@Overridepublic void onResponse(@NotNull Call call, Response response) throws IOException {// 处理请求成功的响应String responseBody = response.body().string();// 在这里处理响应数据System.out.println(responseBody);runOnUiThread(new Runnable() {@Overridepublic void run() {tvContent.setText("异步请求成功" + responseBody);}});}@Overridepublic 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);}
}