10.安卓逆向-安卓开发基础-api服务接口设计1

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:图灵Python学院

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:9.安卓逆向-安卓开发基础-安卓四大组件2

前面的都是ui界面开发,接下来开始安卓网络开发的部分

请求

安卓中通常会使用OkHttp3库(框架)来处理HTTP请求、处理响应以及与服务器进行通信。

以下是OkHttp3的一些主要特点和功能:

  1. 简单易用:OkHttp3 提供了简洁的 API,使得发送HTTP 请求变得简单和直观。它支持常见的 HTTP方法(GET、POST、PUT、DELETE等)和请求参数的设置,可以轻松构建出各种类型的请求。
  2. 高效性能:OkHttp3针对性能进行了优化,使用了连接池和请求复用等机制,减少了网络请求的延迟和资源消耗。它还支持 HTTP/2、SPDY和连接的压缩,提供更快的网络传输速度。
  3. 强大的拦截器:OkHttp3 提供了拦截器(Interceptor)机制,可以在发送请求和接收响应的过程中进行自定义的处理操作。你可以添加和配置多个拦截器,以实现日志记录、请求重试、请求头修改等功能。
  4. 支持异步请求:OkHttp3 支持发送异步请求,可以利用线程池并发地发送多个请求,从而提高请求的性能和吞吐量。同时,它还支持同步请求,即在当前线程中执行请求并等待返回结果。
  5. 文件上传和下载:OkHttp3 提供了方便的 API,用于实现文件的上传和下载功能。通过设置请求体和响应处理器,可以轻松地实现大文件的分块上传和断点续传等操作。
  6. 支持WebSocket:除了常见的 HTTP 请求,OkHttp3还支持使用WebSocket进行双向通信。它提供了WebSocket API,可以在应用程序中实现实时的消息推送和数据交互。

项目中使用OkHttp3

首先如下图添加

implementation 'com.squareup.okhttp3:okhttp:3.14.2' // 用于发送请求
implementation 'com.squareup.okio:okio:1.17.4'  // 用于快速的访问、存储和处理你的数据

然后添加了上面的代码,然后点击下图红框位置,点击之后它会把okhttp3的库下载下载,下载完就可以用了

然后开始使用:

首先创建一个空的Activity,如下图

然后添加下图红框的代码

package com.example.course1;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttp3Dome extends AppCompatActivity {
    public OkHttpClient client = new OkHttpClient();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ok_http3_dome);

        // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么
        Request request = new Request.Builder()
                .url("https://www.baidu.com") // 设置请求的 URL
                .build();

        // newCall请求地址,enqueue里面是请求成功还是失败
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中
                // 请求失败,处理错误
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法
                // 请求成功,处理响应数据
                if (response.isSuccessful()) {
                    String responseData = response.body().string();
                    System.out.println(responseData);
                    // 在这里处理响应数据
                } else {
                    // 请求失败,处理错误
                    // 可以根据 response.code() 判断具体的失败原因
                }
            }
        });

    }
}

然后还要修改一下清单文件

如果不添加下方的代码app无法联网,效果就是闪退

<uses-permission android:name="android.permission.INTERNET" />

点击运行之后就会打印百度的服务器返回的内容了,如下图

然后上图它没有换行自动换行可能看着不好,如下图点击下图蓝框可以超长自动换行

上方的例子是一个GET请求的实例,接下来写post请求的实例

首先要找一个post的链接,巨潮资讯网,下图红框的内容就是一个post请求,接下来通过OkHttp3访问这个请求,以下只是为了学习参考,不会做违法的事情,读者们也不要做违法的事情,不要对网链接进行大量请求导致网页无法正常运行

它的链接是,如下图按F12打开浏览器的控制台,然后找到Network,然后翻页,然后就能看到query了,如果看不到那就是网页更新了,就算更新了也会有类似query的链接

然后单击query,下图红框就是query的链接

下图红框就是query请求给服务器发送的参数(数据)

知道这些以后开始访问它

参数

post请求的请求头中需要添加一个Content-Type用来说明post请求参数的格式,如下图直接复制粘贴

package com.example.course1;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttp3Dome extends AppCompatActivity {
    public OkHttpClient client = new OkHttpClient();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ok_http3_dome);
        post请求();


    }
    public void get(){
        // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么
        Request request = new Request.Builder()
                .url("https://www.baidu.com") // 设置请求的 URL
                .build();

        // newCall请求地址,enqueue里面是请求成功还是失败
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中
                // 请求失败,处理错误
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法
                // 请求成功,处理响应数据
                if (response.isSuccessful()) {
                    String responseData = response.body().string();
                    System.out.println(responseData);
                    // 在这里处理响应数据
                } else {
                    // 请求失败,处理错误
                    // 可以根据 response.code() 判断具体的失败原因
                }
            }
        });
    }
    public void post请求(){
        // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么
        FormBody formBody = new FormBody.Builder() // 构建给服务器发送的数据
                .add("pageNum","1")
                .add("pageSize","30")
                .add("column","szse")
                .add("tabName","fulltext")
                .add("plate","")
                .add("stock","")
                .add("searchkey","")
                .add("secid","")
                .add("category","category_gddh_szsh")
                .add("trade","")
                .add("seDate","2024-03-22~2024-09-23")
                .add("sortName","")
                .add("sortType","")
                .add("isHLtitle","").build();

        Request request = new Request.Builder()
                .url("http://www.cninfo.com.cn/new/hisAnnouncement/query") // 设置请求的 URL
                .post(formBody) // 设置post请求的请求参数(也就是通过post的方式给服务器发送的数据)
                .addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8")// 设置请求头
                .build();

        // newCall请求地址,enqueue里面是请求成功还是失败
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中
                // 请求失败,处理错误
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法
                // 请求成功,处理响应数据
                if (response.isSuccessful()) {
                    String responseData = response.body().string();
                    System.out.println(responseData);
                    // 在这里处理响应数据
                } else {
                    // 请求失败,处理错误
                    // 可以根据 response.code() 判断具体的失败原因
                }
            }
        });
    }
}

写完点运行会报下图的错,原因是安卓29版本(安卓api级别29)默认禁止访问http的api(api的意思是现在可以理解为安卓系统提供的一些可以让我们用的功能),需要设置一下让它允许访问

首先在清单文件中

 android:networkSecurityConfig="@xml/network_security_config"

然后点击下图红框在res文件夹里创建一个文件夹叫xml

然后点击XML Resource File

然后点击下图红框

然后输入下图红框的内容

<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后再点运行,就可以看到 http://www.cninfo.com.cn/new/hisAnnouncement/query 链接给返回的数据了

如下图可以看到一模一样

上方的实例是 application/x-www-form-urlencoded 类型,这个类型叫表单类型,上方用 FormBody 就是一个application/x-www-form-urlencoded 类型,FormBody 会把数据搞成application/x-www-form-urlencoded 类型,然后post常用的还有json类型,json与application/x-www-form-urlencoded可以说是一个东西

然后找一个json的post请求,如下图百度翻译采用的是post请求

它的参数

它返回的东西

开始写代码

package com.example.course1;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class OkHttp3Dome extends AppCompatActivity {
    public OkHttpClient client = new OkHttpClient();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ok_http3_dome);
//        post请求();
        json请求();


    }
    public void get(){
        // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么
        Request request = new Request.Builder()
                .url("https://www.baidu.com") // 设置请求的 URL
                .build();

        // newCall请求地址,enqueue里面是请求成功还是失败
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中
                // 请求失败,处理错误
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法
                // 请求成功,处理响应数据
                if (response.isSuccessful()) {
                    String responseData = response.body().string();
                    System.out.println(responseData);
                    // 在这里处理响应数据
                } else {
                    // 请求失败,处理错误
                    // 可以根据 response.code() 判断具体的失败原因
                }
            }
        });
    }
    public void post请求(){
        // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么
        FormBody formBody = new FormBody.Builder() // 构建给服务器发送的数据
                .add("pageNum","1")
                .add("pageSize","30")
                .add("column","szse")
                .add("tabName","fulltext")
                .add("plate","")
                .add("stock","")
                .add("searchkey","")
                .add("secid","")
                .add("category","category_gddh_szsh")
                .add("trade","")
                .add("seDate","2024-03-22~2024-09-23")
                .add("sortName","")
                .add("sortType","")
                .add("isHLtitle","").build();

        Request request = new Request.Builder()
                .url("http://www.cninfo.com.cn/new/hisAnnouncement/query") // 设置请求的 URL
                .post(formBody) // 设置post请求的请求参数(也就是通过post的方式给服务器发送数据)
                .addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8")// 设置请求头
                .build();

        // newCall请求地址,enqueue里面是请求成功还是失败
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中
                // 请求失败,处理错误
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法
                // 请求成功,处理响应数据
                if (response.isSuccessful()) {
                    String responseData = response.body().string();
                    System.out.println(responseData);
                    // 在这里处理响应数据
                } else {
                    // 请求失败,处理错误
                    // 可以根据 response.code() 判断具体的失败原因
                }
            }
        });
    }
    public void json请求(){
        // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么
        JSONObject json = new JSONObject();
        try {
            json.put("query", "pya");

        } catch (JSONException e) {
            e.printStackTrace();
        }
        // 创建请求体
        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(mediaType, json.toString());

        Request request = new Request.Builder()
                .url("https://fanyi.baidu.com/langdetect") // 设置请求的 URL
                .post(body) // 设置post请求的请求参数(也就是通过post的方式给服务器发送的数据)
                .build();

        // newCall请求地址,enqueue里面是请求成功还是失败
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) { // 请求失败会执行这个方法,一般服务器报错会来到这个方法中
                // 请求失败,处理错误
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException { // 执行成功会执行这个方法
                // 请求成功,处理响应数据
                if (response.isSuccessful()) {
                    String responseData = response.body().string();
                    System.out.println(responseData);
                    // 在这里处理响应数据
                } else {
                    // 请求失败,处理错误
                    // 可以根据 response.code() 判断具体的失败原因
                }
            }
        });
    }
}

效果图:


img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值