插件版网络请求之偷梁换柱插件使用技巧

简介: 插件版网络请求之偷梁换柱插件使用技巧

KJNetworkThiefPlugin


修改 KJNetworkingRequest 和 获取 KJNetworkingResponse 插件


本文主要介绍如何使用 KJNetworkThiefPlugin 插件,来达到修改请求体和获取结果数据的隐藏用法,偷梁换柱小偷行为?所以干脆就给它命名为小偷插件,哈哈哈!请忽略我的搞笑


插件网络使用示例


实例化请求体


设置请求ip,路径,参数,请求方式,插件等等等

KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
request.method = KJNetworkRequestMethodGET;
request.ip = @"https://www.douban.com";
request.path = @"/j/app/radio/channels";

实例化此次网络需要的插件


设置需求插件plugins

KJNetworkThiefPlugin * plugin = [[KJNetworkThiefPlugin alloc] init];
request.plugins = @[plugin];

开启插件版网络调用


就是这么简单简洁的使用,

[KJNetworkPluginManager HTTPPluginRequest:request success:^(KJNetworkingRequest * _Nonnull request, id  _Nonnull responseObject) {
    NSLog(@"----%@",responseObject);
} failure:^(KJNetworkingRequest * _Nonnull request, NSError * _Nonnull error) {
    NSLog(@"----%@",error);
}];

到此,小偷插件使用就算初步完成,是不是特别轻松简单


下面继续接着奏乐接着舞,


修改请求体


KJNetworkThiefPlugin * plugin = [[KJNetworkThiefPlugin alloc] init];
plugin.kChangeRequest = ^(KJNetworkingRequest * _Nonnull request) {
    // 这里即可修改请求体,这里需要提醒一下
    // 此处修改会影响后续网络请求,也就是说会改变你上面设置的 `request`
};

其实一般情况下,我们不会去更改这个请求体,毕竟顺着一条线下来我们就已经设置是自己需要的请求体,当然这个也可以拿来做点骚操作,后面的慢慢讲,咱先一步一步的来


获取插件数据


plugin.kGetResponse = ^(KJNetworkingResponse * _Nonnull response) {
    // 这里可以拿到网络请求返回的原始数据
    NSLog(@"🎷🎷🎷原汁原味的数据 = %@", response.responseObject);
    // 准备插件处理之后的数据
    if (response.opportunity == KJNetworkingRequestOpportunityPrepare) {
        NSLog(@"🎷🎷🎷准备插件处理之后的数据 = %@", response.prepareResponse);
    }
    // 成功插件处理之后的数据
    if (response.opportunity == KJNetworkingRequestOpportunitySuccess) {
        NSLog(@"🎷🎷🎷成功插件处理之后的数据 = %@", response.successResponse);
    }
    // 失败插件处理之后的数据
    if (response.opportunity == KJNetworkingRequestOpportunityFailure) {
        NSLog(@"🎷🎷🎷失败插件处理之后的数据 = %@", response.failureResponse);
        NSLog(@"🎷🎷🎷失败 = %@", response.error);
    }
};

备注说明:如果你使用的插件没有处理过成功数据或者失败数据,甚至任何一个插件数据,只要未经插件处理过,那么对应的该插件数据即为空,不必大惊小怪


失败之后更改请求体


不知道大家在使用的过程中,有没有遇见这样的情况:


场景一:通常情况下我们的默认域名都是同一个,但是有的时候也会出现这样的场景,常规操作之下使用默认域名,如果失败则换另外的备用域名


场景二:网络请求第一次失败之后,更换另外一套网络接口

KJNetworkThiefPlugin * plugin = [[KJNetworkThiefPlugin alloc] init];
// 该字段必须开启,才会再次调用网络请求
plugin.againRequest = YES;
plugin.kChangeRequest = ^(KJNetworkingRequest * _Nonnull request) {
    // 场景一,失败之后更换ip
    if (request.opportunity == KJNetworkingRequestOpportunityFailure) {
        request.ip = @"https://www.baidu.com";
    }
    // 场景二,失败之后更换另外一套网络接口
    if (request.opportunity == KJNetworkingRequestOpportunityFailure) {
        request.path = @"/other/path";
        request.params = @{
            @"token": @"XHFI-213-XDJHso-A0345",
            @"userid": @"likeyou",
        };
    }
};

我觉得还有更多骚操作,可以玩一下,待发现ing..


多插件时刻获取插件数据


插件版网络就是有这样一个弊端,最终成功或者失败回调出来的数据都是最后一个插件处理之后的数据,那么如果我想拿到中间某个插件处理之后的数据,常规的方法就不行,于是就有了下面这种骚操作来满足这些无理取闹的需求

KJNetworkCachePlugin * cache = [[KJNetworkCachePlugin alloc] init];
...
缓存插件相关操作
KJNetworkThiefPlugin * afterCache = [[KJNetworkThiefPlugin alloc] init];
afterCache.kGetResponse = ^(KJNetworkingResponse * _Nonnull response) {
    // 获取缓存插件处理后的数据
};
KJNetworkAnslysisPlugin * anslysis = [[KJNetworkAnslysisPlugin alloc] init];
... 
解析插件相关操作
KJNetworkThiefPlugin * afterAnslysis = [[KJNetworkThiefPlugin alloc] init];
afterAnslysis.kGetResponse = ^(KJNetworkingResponse * _Nonnull response) {
    // 获取解析插件处理后的数据
};
// 这里设置好对应插件顺序即可    
request.plugins = @[cache, afterCache, anslysis, afterAnslysis];

我依然觉得还有更多用法待发现,去吧!皮卡丘


完整测试用例


提供完整的测试用例,自己去玩吧

- (void)testThiefPlugin{
    XCTestExpectation * expectation = [self expectationWithDescription:@"test thief plugin."];
    KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
    request.method = KJNetworkRequestMethodGET;
    request.ip = @"https://www.douban.com";
    request.path = @"/j/app/radio/channels";
    request.responseSerializer = KJResponseSerializerJSON;
    KJNetworkThiefPlugin * plugin = [[KJNetworkThiefPlugin alloc] init];
    plugin.kGetResponse = ^(KJNetworkingResponse * _Nonnull response) {
        // 这里可以拿到网络请求返回的原始数据
        NSLog(@"🎷🎷🎷原汁原味的数据 = %@", response.responseObject);
    };
    request.plugins = @[plugin];
    [KJNetworkPluginManager HTTPPluginRequest:request success:^(KJNetworkingRequest * _Nonnull request, id  _Nonnull responseObject) {
        NSLog(@"----%@",responseObject);
        [expectation fulfill];
    } failure:^(KJNetworkingRequest * _Nonnull request, NSError * _Nonnull error) {
        XCTFail(@"%@", error.localizedDescription);
    }];
    [self waitForExpectationsWithTimeout:30 handler:nil];
}

结尾介绍


关于这个插件版网络库,即将开源使用,需要的朋友自行

pod 'KJNetworkPlugin' # 插件版网络
pod 'KJNetworkPlugin/Thief' # 偷梁换柱插件

写东西着实累,老铁们觉得有用还望点个星支持一下,传送门KJNetworkPlugin

后面有相关插件我也会慢慢补充...

相关文章
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s 网络插件—kube-router
【K8S系列】深入解析k8s 网络插件—kube-router
1273 1
|
canal Kubernetes 关系型数据库
【K8S系列】深入解析k8s网络插件—Canal
【K8S系列】深入解析k8s网络插件—Canal
1795 0
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s网络插件—Cilium
【K8S系列】深入解析k8s网络插件—Cilium
1060 1
|
7月前
|
Kubernetes Cloud Native Docker
云原生|kubernetes|网络插件flannel二进制部署和calico的yaml清单部署总结版
云原生|kubernetes|网络插件flannel二进制部署和calico的yaml清单部署总结版
858 0
|
7月前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
3月前
|
Kubernetes 容器 Perl
Kubernetes网络插件体系及flannel基础
文章主要介绍了Kubernetes网络插件体系,特别是flannel网络模型的工作原理、配置和测试方法。
118 3
Kubernetes网络插件体系及flannel基础
|
4月前
|
存储 canal Kubernetes
在K8S中,什么是CNI?平时K8s集群常用什么网络插件?
在K8S中,什么是CNI?平时K8s集群常用什么网络插件?
|
4月前
|
大数据 RDMA
神龙大数据加速引擎MRACC问题之MRACC-Spark利用eRDMA近网络优化插件来提升性能如何解决
神龙大数据加速引擎MRACC问题之MRACC-Spark利用eRDMA近网络优化插件来提升性能如何解决
46 0
|
5月前
|
缓存 安全 Web App开发
Chrome插件实现问题之网络进程接收到URL请求后会如何解决
Chrome插件实现问题之网络进程接收到URL请求后会如何解决
|
6月前
|
安全 数据可视化 JavaScript
【内网安全】域信息收集&应用网络凭据&CS插件&Adfind&BloodHound
【内网安全】域信息收集&应用网络凭据&CS插件&Adfind&BloodHound
105 1