当前位置:   article > 正文

app逆向-⽹络请求库okhttp3

app逆向-⽹络请求库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();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这个例子中:

我们创建了一个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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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'
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

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);
                    }
                });
            }
        });
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

效果图:
在这里插入图片描述

四、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;
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在创建请求对象时调用

private final OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(new LoggingInterceptor())
        .build();
  • 1
  • 2
  • 3

效果图:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/77235
推荐阅读
相关标签
  

闽ICP备14008679号