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

news2024/11/15 19:28:38

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

内容参考于:图灵Python学院

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

工具下载:

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

提取码:6tw3

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

上一个内容:10.安卓逆向-安卓开发基础-api服务接口设计1

上一个内容里通过OkHttp3实现了post和get请求,本次接着上一个内容继续

实现搜索爬虫

爬虫做的事是把下图红框的数据读取出来放到ui界面中,下图的链接在上一个内容中

创建一个Empty Activity

先写ui界面,如下图样子

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".HttpSearch">

<EditText
   android:id="@+id/editText1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:hint="请输入搜索页码"
   android:inputType="text" />

<Button
   android:id="@+id/button1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="提交"
/>

<ListView
   android:id="@+id/listView"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   />

<TextView
   android:id="@+id/text1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:textSize="18sp"
   android:textColor="@android:color/black" />

</LinearLayout>

要注意下图红框位置的内容,要与Activity名字一样

然后修改清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.course1">

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

<application
   android:allowBackup="true"
   android:icon="@mipmap/ic_launcher"
   android:label="@string/app_name"
   android:networkSecurityConfig="@xml/network_security_config"
   android:roundIcon="@mipmap/ic_launcher_round"
   android:supportsRtl="true"
   android:theme="@style/Theme.Course1">
   <activity
       android:name=".HttpSearch"
       android:exported="true" >
       <intent-filter>
           <action android:name="android.intent.action.MAIN" />

           <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
   </activity>
   <activity
       android:name=".OkHttp3Dome"
       android:exported="false">
<!--            <intent-filter>-->
<!--                <action android:name="android.intent.action.MAIN" />-->

<!--                <category android:name="android.intent.category.LAUNCHER" />-->
<!--            </intent-filter>-->
   </activity>
   <activity
       android:name=".liebiao"
       android:exported="false">

       <!-- <intent-filter> -->
       <!-- <action android:name="android.intent.action.MAIN" /> -->


       <!-- <category android:name="android.intent.category.LAUNCHER" /> -->
       <!-- </intent-filter> -->
   </activity>
   <activity
       android:name=".tiaozhuan2"
       android:exported="false" />
   <activity
       android:name=".tiaozhuan1"
       android:exported="true">

       <!-- <intent-filter> -->
       <!-- <action android:name="android.intent.action.MAIN" /> -->


       <!-- <category android:name="android.intent.category.LAUNCHER" /> -->
       <!-- </intent-filter> -->
   </activity>
   <activity
       android:name=".MainActivity2"
       android:exported="false" />
   <activity
       android:name=".MainActivity"
       android:exported="false">

       <!-- <intent-filter> -->
       <!-- <action android:name="android.intent.action.MAIN" /> -->


       <!-- <category android:name="android.intent.category.LAUNCHER" /> -->
       <!-- </intent-filter> -->
   </activity>
</application>

</manifest>

然后Activity里的代码

package com.example.course1;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

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

import java.io.IOException;
import java.util.ArrayList;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.internal.http2.Header;

public class HttpSearch extends AppCompatActivity {

private EditText mEditText;
private Button mButton;
ListView listView;
public OkHttpClient client = new OkHttpClient();

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_http_search);

   mEditText = findViewById(R.id.editText1);
   mButton =  findViewById(R.id.button1);
   listView = findViewById(R.id.listView2);

   mButton.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           String text = mEditText.getText().toString();
           sendRequest(text);
       }
       private void sendRequest(String page) {
           new Thread(new Runnable() {//  new Thread是开启一个新的线程,去执行代码,运行代码的东西被称为线程,这样写为了高性能
               @Override
               public void run() {
                   // 创建请求对象,也就是告诉OKHTTP3要访问的连接地址和参数是什么
                   FormBody formBody = new FormBody.Builder() // 构建给服务器发送的数据
//                        .add("pageNum","1")
                           .add("pageNum", page)
                           .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();
                               try {
                                   JSONObject jsonObject = new JSONObject(responseData);
                                   JSONArray announcements = (JSONArray) jsonObject.get("announcements");
                                   ArrayList<String> list = new ArrayList<>();
                                   for (int i = 0; i < announcements.length(); i++) {
                                       jsonObject = (JSONObject) announcements.get(i);
                                       list.add(jsonObject.get("secName").toString());
                                       System.out.println(jsonObject.get("secName").toString());
                                   }

                                   showResponse(list);// 调用 showResponse 把数据放到 ListView 里

                                   Headers headers = response.headers();
                                   for (int i = 0; i < headers.size(); i++) {
                                       System.out.println(headers.name(i) + ": " + headers.value(i)); // 获取响应头
                                   }

                               } catch (JSONException e) {
                                   e.printStackTrace();
                               }

//                            System.out.println(responseData);
                               // 在这里处理响应数据
                           } else {
                               // 请求失败,处理错误
                               // 可以根据 response.code() 判断具体的失败原因
                           }
                       }
                   });
               }
               private void showResponse(final ArrayList list){
                  runOnUiThread(new Runnable() {// 在非主线程中修改界面里的内容需要使用 runOnUiThread
                       @Override
                       public void run() {
                           MyAdapter myAdapter = new MyAdapter(list);
                           listView.setAdapter(myAdapter);// 把爬到的数据放到ListView里
                       }
                   });
               }
           }).start();
       }
   });

}
}

除了修改了上方刚创建的Activity,还修改了下图红框里的内容

效果图:输入2,然后点提交就会把接口返回的数据放到ListView里,这个2是页数,通过分析接口返回的数据得到的,如果不知道怎么分析是正常的,还没开始搞分析数据

获取响应头

然后是拦截器

如下图红框,调用链接请求服务器是会带着下图红框里的内容(不同网页内容都不一样,都是根据功能业务来的)去访问服务器,有的服务器会校验里面的内容,比如校验是否登录了,Request是请求头,请求服务器的时候会带着,Response一般是响应头是服务器给的,拦截器就是为了设置请求头和响应头的,它会在访问服务器或服务器处理完请求返回到客户端之前拦截下来进行处理,处理一般就是设置请求头和响应头

拦截器使用代码

设置请求头

   OkHttpClient client = new OkHttpClient.Builder()
           .addInterceptor(new Interceptor() {
               @Override
               public Response intercept(Chain chain) throws IOException {
                   // 获取原始请求
                   Request originalRequest = chain.request();

                   // 创建一个新的请求,添加或修改请求头
                   Request modifiedRequest = originalRequest.newBuilder()
                            // 示例:
                           .addHeader("Authorization", "Bearer your_access_token")
                           .addHeader("User-Agent", "YourApp/1.0")
                           .addHeader("aaaaaa", "cajlkcjklj")
                           .build();

                   // 继续请求链路,但使用修改后的请求
                   return chain.proceed(modifiedRequest);
               }
           })
           .build();

设置响应头

OkHttpClient client = new OkHttpClient.Builder()
           .addInterceptor(new Interceptor() {
               @Override
               public Response intercept(Chain chain) throws IOException {
                   Response originalResponse = chain.proceed(chain.request());

                   // 添加自定义响应头
                   originalResponse = originalResponse.newBuilder()
                       	 // 设置请求头
                           .header("Custom-Header", "YourValue")
                            // 添加请求头
                           .addHeader("sdfsdf", "4214532453")
                           .build();

                   return originalResponse;
               }
           })
           .build();

上方的代码不全,只有手写的代码

完整代码:

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg?pwd=q9n5

提取码:q9n5

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


img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云手机推荐:五款热门云手机测评!

在云手机市场中&#xff0c;各个品牌层出不穷&#xff0c;让人难以选择。为了帮助你更好地找到适合的云手机应用&#xff0c;我们整理了五款最受欢迎的云手机进行测评。2024年&#xff0c;哪款云手机是你的不二之选&#xff1f;且慢下结论&#xff0c;看看这五款云手机的真实表…

【深度学习】深度卷积神经网络(AlexNet)

在 LeNet 提出后&#xff0c;卷积神经网络在计算机视觉和机器学习领域中很有名气&#xff0c;但并未起到主导作用。 这是因为 LeNet 在更大、更真实的数据集上训练的性能和可行性还有待研究。 事实上&#xff0c;在 20 世纪 90 年代到 2012 年之间的大部分时间里&#xff0c;…

Windows系统的Tomcat日志路径配置

文章目录 引言I Windows系统的Tomcat日志路径配置配置常规日志路径访问日志路径配置,修改server.xmlII 日志文件切割:以分隔割tomcat 的 catalina.out 文件为例子通过Linux系统自带的切割工具logrotate来进行切割引言 需求:C盘空间不足,处理日志文件,tomcat日志迁移到D盘…

中国科学院云南天文台博士招生目录

中国科学院云南天文台是专业基础研究与应用研究结合的综合性天文研究机构&#xff08;其前身是1938年中央研究院天文研究所在昆明东郊凤凰山创建的凤凰山天文台&#xff09;&#xff0c;总部在云南省昆明市&#xff0c;设有两个观测站&#xff08;丽江高美古天文观测站和澄江抚…

Boruta 的库的初识

我在一个kaggle比赛时间预测中发现Boruta我并不熟悉与是我学习了一下 Boruta 的工作原理&#xff1a; 影子特征&#xff08;Shadow Features&#xff09;: Boruta 首先创建一组影子特征&#xff0c;这些影子特征是通过随机打乱原始特征的值生成的。影子特征的目的是作为对照组…

【完结】【PCL实现点云分割】ROS深度相机实践指南(下):pcl::BoundaryEstimation实现3D点云轮廓检测的原理(论文解读)和代码实现

前言 本教程使用PCL对ROS深度相机捕获到的画面进行操场上锥桶的分割 上:[csdn 博客] 【PCL实现点云分割】ROS深度相机实践指南&#xff08;上&#xff09;:PCL库初识和ROS-PCL数据类型转换中:[csdn 博客] 【PCL实现点云分割】ROS深度相机实践指南&#xff08;中&#xff09;:Pl…

电梯节能 引领趋势

电梯&#xff0c;之前对我们来说&#xff0c;就是让我们省时省力的工具&#xff0c;谁知电梯也可加装【节能设备】。 电梯节能评估&#xff0c;节电率达20%-50%。 电梯节能&#xff08;电梯回馈装置&#xff09;通常电梯在轻载上行&#xff0c;重载下行和平层停梯状态下&#…

监控和维护 Linux 系统的健康状态:从服务启动故障到操作系统查询

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

rar文件怎么打开?这几款软件压缩和查看很方便!

在这个数字化信息爆炸的时代&#xff0c;我们每天都会接触到各种各样的文件&#xff0c;其中RAR格式文件以其高压缩率和良好的文件保护特性&#xff0c;成为了许多人分享和存储大文件的首选。然而&#xff0c;面对这样一个看似“神秘”的文件格式&#xff0c;不少朋友可能会感到…

Stable Diffusion绘画 | 来训练属于自己的模型:配置完成,炼丹启动

前言 效率设置-优化器 优化器可以分为4类&#xff1a; 第一类 AdamW &#xff1a;梯度下降算法&#xff0c;结合自适应学习率&#xff0c;既可以快速收敛&#xff0c;又可以避免 Loss值 震荡 AdamW8bit&#xff1a;能降低显存占用&#xff0c;并略微加快训练速度&#xff0…

Mysql—主从复制的slave添加及延迟回放

MySQL 主从复制是什么&#xff1f; ​ MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式&#xff0c;这样从节点不用一直访问主服务器来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0c;…

国产分布式数据库-tidb单机部署文档

tidb单机部署文档 1、创建用户 #创建用户 useradd tidb #设置密码 passwd tidb2、配置免密码登录 编辑/etc/sudoers文件,文末加入&#xff1a; tidb ALL(ALL) NOPASSWD:ALL如果想要控制某个用户(或某个组用户)只能执行root权限中的一部分命令, 或者允许某些用户使用sudo时…

充电桩设备升级扩展多段计费

一 项目背景 某省某市的一个充电桩项目近日收到业主需求&#xff0c;需在国庆节增加一个时间段&#xff08;深谷计费段&#xff09;&#xff0c;但充电桩设备仅支持4段&#xff08;尖时段&#xff0c;峰时段&#xff0c;平时段&#xff0c;谷时段&#xff09;&#xff0c;今…

【CoppeliaSim V4.7】The Python interpreter could not handle the wrapper script

[sandboxScript:error] The Python interpreter could not handle the wrapper script (or communication between the launched subprocess and CoppeliaSim could not be established via sockets). Make sure that the Python modules ‘cbor2’ and ‘zmq’ are properly i…

Spring MVC 基本配置步骤 总结

1.简介 本文记录Spring MVC基本项目拉起配置步骤。 2.步骤 在pom.xml中导入依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.6</version><scope>…

关于javascript中防抖和节流的使用详解

防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常见的优化技巧&#xff0c;通常用于控制函数在短时间内频繁触发的场景&#xff0c;尤其是在处理用户输入、滚动、窗口大小调整等事件时。它们的主要目的是减少不必要的函数调用&#xff0c;…

想把泰文从文本上识别,什么软件工具好用呢?

泰文识别技术涉及将泰文图像转换成数字文本&#xff0c;主要通过光学字符识别&#xff08;OCR&#xff09;技术实现。这项技术广泛应用于文档处理、语言学习和翻译服务。实现泰文识别的方法包括使用手机应用程序、在线服务、专业软件&#xff0c;以及结合人工智能和机器学习。此…

UE5 C++: 插件编写04 | 自动增加前缀

准备工作 UObject* Asset UObject* Asset 通常指的是一个指向UObject的指针。UObject是Unreal Engine中的基类&#xff0c;几乎所有的引擎对象都继承自UObject。这个指针可以引用任何派生自UObject的对象&#xff0c;比如蓝图、材质、贴图、音频资源等资产。 如果你看到UObj…

【C++】——set和map的使用

文章目录 set的特性set初始化set迭代器和常见成员函数multisetmap的特性map初始化map迭代器和常见成员函数insert[]运算符重载multimap set的特性 自动排序&#xff1a; set中的元素会默认排升序存储唯一性&#xff1a; set中每个元素都是唯一的&#xff0c;如果插入一个已有元…

如何找到实力突出的建站公司,2024网络建站公司推荐

选择网站建设公司需要考虑公司以下几点&#xff1a; 是否对的业务需求的了解程度如何&#xff1f; 与公司的文化契合度 相同企业文化的公司&#xff0c;往往能取得很好的合作 沟通的方式 考虑&#xff1a;谁将是解决疑虑、查询、反馈的联系人&#xff0c;查询的响应时间是…