插件版網絡請求之偷樑換柱插件使用技巧

KJNetworkThiefPlugin

修改 KJNetworkingRequest 和 獲取 KJNetworkingResponse 插件git

本文主要介紹如何使用 KJNetworkThiefPlugin 插件,來達到修改請求體和獲取結果數據的隱藏用法,偷樑換柱小偷行爲?因此乾脆就給它命名爲小偷插件,哈哈哈!請忽略個人搞笑github

插件網絡使用示例

  • 實例化請求體

設置請求ip,路徑,參數,請求方式,插件等等等緩存

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

複製代碼
  • 實例化這次網絡須要的插件

設置需求插件pluginsmarkdown

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);
}];
複製代碼

到此,小偷插件使用就算初步完成,是否是特別輕鬆簡單app


下面繼續接着奏樂接着舞,oop

修改請求體

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);
    }
    
};
複製代碼

備註說明:若是你使用的插件沒有處理過成功數據或者失敗數據,甚至任何一個插件數據,只要未經插件處理過,那麼對應的該插件數據即爲空,沒必要大驚小怪spa

失敗以後更改請求體

不知道你們在使用的過程當中,有沒有碰見這樣的狀況:插件

  • 場景一:一般狀況下咱們的默認域名都是同一個,可是有的時候也會出現這樣的場景,常規操做之下使用默認域名,若是失敗則換另外的備用域名
  • 場景二:網絡請求第一次失敗以後,更換另一套網絡接口
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

後面有相關插件我也會慢慢補充...

相關文章
相關標籤/搜索