• 安卓逆向(二)httpClient使用


    在python里我们经常使用 requests | urllib| httpx 等进行网络请求,那么在Java中如何实现各种网络请求呢?

    首先我们引出几个网络请求库看一下:


    httpClient ->HttpURLConnection ->  Nohttp -> Okhttp

    HttpClient:

             HttpClient 是 Apache下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient支持的功能如下: 支持 Http0.9、H ttp1.0和Http1.1协议。 实现了Http全部的方法(GET,POST,PUT,HEAD 等)。 支持HTTPS协议。 支持代理服务器。 提供安全认证方案。

             提供连接池以便重用连接。 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。 在http1.0和http1.1中利用KeepAlive保持长连接。

            HttpClient 连接池 HttpClient经常会用到连接池,以便重用tcp连接,特别是在使用长连接时能节约不少性能(避免了三次握手和四次解握)。 HttpClient连接池的逻辑是:先根据域名route 来找是否有空闲的连接,如果有就取出来用。

            在后端领域,出现比较早而且使用仍然很广泛的HTTP客户端框架非Apache HttpClient莫属了,目前大量项目和公司仍在采用该框架。

    问题抛出:

            Apache公司开发,在早期非常受广大作者喜爱使用,  在android升级到6.0之后就取消了对 HttpClient 的支持,推荐使用的是 HttpURLConnection,到9.0正式弃用,在我查阅了各种资料后,都没有明确说明为何弃用,都只是部分提及了高版本兼容性问题。该问题值得大家思考和证实?

           ( 目前个人感觉是因为安卓自己开发了HttpURLConnection使用,下架 HttpClient 及 使用时需要Apache服务插件和依赖造成的繁琐原因。只代表个人观点)

    HttpURLConnection:


            在安卓6.0之后开始取消支持后,他们自己推出并封装了HttpURLConnection供使用者使用,

    菜鸟教程:7.1.3 Android HTTP请求方式:HttpURLConnection | 菜鸟教程

    Nohttp :    

            官方开源源码 : https://github.com/yanzhenjie/NoHttp    

            NoHttp是基于队列的形式请求,可以取消某个请求,可以取消某几个指定请求,可以通过队列取消所有请求。
            在 HttpURLConnection 更加封装调用,只能在安卓上使用。 16年阿里开发者,并进行宣传。

       小故事:

                 nohttp 在开发完之后,进行了大量宣传各种技术博客,论坛等多渠道都有,那个时间提及nothttp大家都会略知一二,当然当时也遭到一批抵制者,觉得宣传过度,正值httpClient逐渐被Android SDK 替换和下架的时候,nohttp逐渐崛起,后随着一直更新和完善,现在使用也是相当可以。

    Okhttp:

            官方开源源码 : https://github.com/square/okhttp
    一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由美国移动支付Square公司贡献。

            该框架是目前主流框架,支持http2,对一台机器的所有请求共享同一个socket,异步调用的回调函数是在子线程完成。

            

    抛出问题,为什么有的叫 Okhttp 有的叫 Okhttp3,两者有什么联系及关联呢?

       OkHttp3OkHttp发展到版本3.0之后的名字。在maven中央仓库搜索okhttp,可以看到包名为com.squareup.okhttp项目的最后版本号是2.7.5,而3.0版本之后,包名更改为com.squareup.okhttp3,同时版本号从3.0.0-RC1开始。后面为了区分,OkHttp 3.0之后的版本统一称为OkHttp3

    特点:

    • 支持允许对同一主机的所有请求共享一个连接。
    • 使用连接池降低请求延迟。
    • 自动处理GZip压缩减少流量消耗。
    • 缓存请求响应,避免网络重复请求。
    • 网络出现问题时,能够静默恢复。
    • 对于多个IP的服务,失败时能够自动切换到备用地址。
    • 支持现代TLS功能(TLS 1.3,ALPN,证书固定)。
    • 请求/响应API具有流畅的构建器和不变性。
    • 支持同步请求和异步请求。
    • 支持自定义拦截器以实现更高级的功能(例如重定向、日志打印等)。

            目前小红书app就使用该框架,若想拦截请求及hook响应及参数,需要对该框架大致了解,及查看使用的框架api进行针对性拦截。(使用Okhttp3中的call方法,在newRealCall()中初始化了RealCall,hook-okhttp3.RealCall即可拿到请求包)

    大家若有兴趣可以查看git源码 或 Okhttp3源码解析(3)-Call分析(整体流程)_秦子帅的博客-CSDN博客 博客中的分析。

    好的,目前正是进入我们今天的主题,httpClent 

     创建一个maven工程,在pom.xml中引入jar包依赖:
     

    1. org.apache.httpcomponents
    2. httpclient
    3. 4.5.5

            

    具体操作详见:Java HttpClient爬虫请求_Codeooo的博客-CSDN博客

    实际实用效果: 可搭建服务,可用于xposed-hook回发,可用于网络请求,Java爬虫等。

    eg: 微博hook cookie并发送到外部服务端入库

            

    这样就可以将微博的cookie hook并从手机中发到外部服务上,进行传输。

  • 相关阅读:
    《LeetCode力扣练习》代码随想录——链表(环形链表II---Java)
    matlab 13折线法数据量化编码与解码
    【云原生 | Docker 基础篇】06、本地镜像发布到阿里云
    2023.10.20 LED驱动
    c语言练习70:反转两次的数字
    [UEFI]EFI_DEVICE_PATH_PROTOCOL 结构体初始化的一个例子
    代码随想录第五十三天|最长公共子序列、最大子数组
    阿里云服务器ECS详细介绍_云主机_服务器托管_弹性计算
    设计符合REST原则的API可以遵循以下步骤
    【云原生与5G】微服务加持5G核心网
  • 原文地址:https://blog.csdn.net/weixin_38927522/article/details/126099666