AFNetworking原始碼探究(十五) —— 請求序列化之架構分析(一)

weixin_33890499發表於2018-03-02

版本記錄

版本號 時間
V1.0 2018.03.02

前言

我們做APP發起網路請求,都離不開一個非常有用的框架AFNetworking,可以說這個框架的知名度已經超過了蘋果的底層網路請求部分,很多人可能不知道蘋果底層是如何發起網路請求的,但是一定知道AFNetworking,接下來幾篇我們就一起詳細的解析一下這個框架。感興趣的可以看上面寫的幾篇。
1. AFNetworking原始碼探究(一) —— 基本介紹
2. AFNetworking原始碼探究(二) —— GET請求實現之NSURLSessionDataTask例項化(一)
3. AFNetworking原始碼探究(三) —— GET請求實現之任務進度設定和通知監聽(一)
4. AFNetworking原始碼探究(四) —— GET請求實現之代理轉發思想(一)
5. AFNetworking原始碼探究(五) —— AFURLSessionManager中NSURLSessionDelegate詳細解析(一)
6. AFNetworking原始碼探究(六) —— AFURLSessionManager中NSURLSessionTaskDelegate詳細解析(一)
7. AFNetworking原始碼探究(七) —— AFURLSessionManager中NSURLSessionDataDelegate詳細解析(一)
8. AFNetworking原始碼探究(八) —— AFURLSessionManager中NSURLSessionDownloadDelegate詳細解析(一)
9. AFNetworking原始碼探究(九) —— AFURLSessionManagerTaskDelegate中三個轉發代理方法詳細解析(一)
10. AFNetworking原始碼探究(十) —— 資料解析之資料解析架構的分析(一)
11. AFNetworking原始碼探究(十一) —— 資料解析之子類中協議方法的實現(二)
12. AFNetworking原始碼探究(十二) —— 資料解析之子類中協議方法的實現(三)
13. AFNetworking原始碼探究(十三) —— AFSecurityPolicy與安全認證 (一)
14. AFNetworking原始碼探究(十四) —— AFSecurityPolicy與安全認證 (二)

回顧

上一篇介紹了AFSecurityPolicy與安全認證,這一篇我們看一下請求引數的序列化問題,對應的都在檔案AFURLRequestSerialization中,下面我們就開始了。


請求序列化中的類和協議

下面我們就看一下請求序列化中的類和協議。

  • @protocol AFURLRequestSerialization <NSObject, NSSecureCoding, NSCopying>
  • @interface AFHTTPRequestSerializer : NSObject <AFURLRequestSerialization>
  • @protocol AFMultipartFormData
  • @interface AFJSONRequestSerializer : AFHTTPRequestSerializer
  • @interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer

這裡是一個父類,兩個子類,父類遵循了一個協議,還有另外一個單獨的協議,它們之間的關係可以參考下圖。

3691932-a72145cfac6e15e3.png

上面這個圖是我畫的,應該很清楚他們之間的關係了吧。


請求序列化的架構

大家還記得前面幾篇寫的response資料解析的結構嗎?其實這裡request資料解析的架構是一樣的,都是父類和子類均實現AFURLRequestSerialization這個協議,實現了請求的序列化。

/**
 The `AFURLRequestSerialization` protocol is adopted by an object that encodes parameters for a specified HTTP requests. Request serializers may encode parameters as query strings, HTTP bodies, setting the appropriate HTTP header fields as necessary.

 For example, a JSON request serializer may set the HTTP body of the request to a JSON representation, and set the `Content-Type` HTTP header field value to `application/json`.
 */
@protocol AFURLRequestSerialization <NSObject, NSSecureCoding, NSCopying>

/**
 Returns a request with the specified parameters encoded into a copy of the original request.

 @param request The original request.
 @param parameters The parameters to be encoded.
 @param error The error that occurred while attempting to encode the request parameters.

 @return A serialized request.
 */
- (nullable NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
                               withParameters:(nullable id)parameters
                                        error:(NSError * _Nullable __autoreleasing *)error NS_SWIFT_NOTHROW;

@end

AFURLRequestSerialization協議被一個物件所採用,該物件為指定的HTTP請求編碼引數。 請求序列化器可以將引數編碼為查詢字串,HTTP主體,根據需要設定適當的HTTP頭欄位。

例如,JSON請求序列化器可以將請求的HTTP主體設定為JSON表示,並將Content-TypeHTTP標頭欄位值設定為application / json

從這就能看出,AFN這個框架的設計架構和思想都是非常好,值得我們去學習的。

後記

本篇對請求序列化的類、協議以及架構進行了分析,下一篇將對序列化的流程進行分析,喜歡的就給個關注和贊~~

3691932-fcf04ee775571891.jpg

相關文章