@@ -188,7 +188,7 @@ - (NSString *)URLEncodedStringValue {
188
188
field: @"nums", value: @"2",
189
189
]
190
190
->
191
- name=bang&phone[mobile]=xx&phone[home]=xx&families[]=father&families[]=mother&nums=1&num =2
191
+ name=bang&phone[mobile]=xx&phone[home]=xx&families[]=father&families[]=mother&nums=1&nums =2
192
192
193
193
194
194
*/
@@ -293,7 +293,7 @@ - (instancetype)init {
293
293
// self.mutableObservedChangedKeyPaths其实就是我们自己设置的request属性值的集合。
294
294
self.mutableObservedChangedKeyPaths = [NSMutableSet set ];
295
295
// 给自己这些方法添加观察者为自己,就是request的各种属性,set方法
296
- // KVO触发的方法在 560行
296
+ // KVO触发的方法在 605行
297
297
for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths ()) {
298
298
if ([self respondsToSelector: NSSelectorFromString (keyPath)]) {
299
299
[self addObserver: self forKeyPath: keyPath options: NSKeyValueObservingOptionNew context: AFHTTPRequestSerializerObserverContext];
@@ -428,7 +428,7 @@ - (NSMutableURLRequest *)requestWithMethod:(NSString *)method
428
428
// AFHTTPRequestSerializerObservedKeyPaths() 就是封装了一些属性的名字,这些都是NSUrlRequest的属性
429
429
for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths ()) {
430
430
// 如果自己观察到的发生变化的属性在这些方法里
431
- // mutableObservedChangedKeyPaths 在-init方法对这个集合进行了初始化,并且对当前类的和NSUrlRequest相关的那些属性添加了KVO监听 在253行
431
+ // mutableObservedChangedKeyPaths 在-init方法对这个集合进行了初始化,并且对当前类的和NSUrlRequest相关的那些属性添加了KVO监听 在294行
432
432
if ([self .mutableObservedChangedKeyPaths containsObject: keyPath]) {
433
433
// 用KVC的方式,把属性值都设置到我们请求的request中去。
434
434
[mutableRequest setValue: [self valueForKeyPath: keyPath] forKey: keyPath];
@@ -448,33 +448,59 @@ - (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method
448
448
{
449
449
NSParameterAssert (method);
450
450
NSParameterAssert (![method isEqualToString: @" GET" ] && ![method isEqualToString: @" HEAD" ]);
451
- // 生成request
451
+ // 生成request 注意:此时传入的参数是nil
452
452
NSMutableURLRequest *mutableRequest = [self requestWithMethod: method URLString: URLString parameters: nil error: error];
453
453
454
- //
454
+ // 初始化AFStreamingMultipartFormData 构建bodyStream
455
455
__block AFStreamingMultipartFormData *formData = [[AFStreamingMultipartFormData alloc ] initWithURLRequest: mutableRequest stringEncoding: NSUTF8StringEncoding];
456
456
457
457
if (parameters) {
458
+ // 构建一个AFQueryStringPair,其中field为"Filename",value为"文件名"
459
+
460
+ /* * parameters
461
+ @{
462
+ @"name" : @"bang",
463
+ @"phone": @{@"mobile": @"xx", @"home": @"xx"},
464
+ @"families": @[@"father", @"mother"],
465
+ @"nums": [NSSet setWithObjects:@"1", @"2", nil]
466
+ }
467
+ -> AFQueryStringPair
468
+ @[
469
+ field: @"name", value: @"bang",
470
+ field: @"phone[mobile]", value: @"xx",
471
+ field: @"phone[home]", value: @"xx",
472
+ field: @"families[]", value: @"father",
473
+ field: @"families[]", value: @"mother",
474
+ field: @"nums", value: @"1",
475
+ field: @"nums", value: @"2",
476
+ ]
477
+ */
458
478
for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary (parameters)) {
459
479
NSData *data = nil ;
460
480
if ([pair.value isKindOfClass: [NSData class ]]) {
461
481
data = pair.value ;
462
482
} else if ([pair.value isEqual: [NSNull null ]]) {
463
483
data = [NSData data ];
464
484
} else {
485
+ // 根据对应value的类型,构建出一个NSData变量 把string类型转换为NSData类型数据
465
486
data = [[pair.value description ] dataUsingEncoding: self .stringEncoding];
466
487
}
467
488
468
489
if (data) {
490
+ // 根据data和name构建Request的header和body
491
+ // AFStreamingMultipartFormData的方法-拼接request一般参数
469
492
[formData appendPartWithFormData: data name: [pair.field description ]];
470
493
}
471
494
}
472
495
}
473
496
474
497
if (block) { // 回调用户block
498
+ // 往formData中添加数据
475
499
block (formData);
476
500
}
477
501
// 生成最终的request
502
+ // 设置一下MultipartRequest的bodyStream或者其特有的content-type
503
+ // 将所有请求参数拼接好
478
504
return [formData requestByFinalizingMultipartFormData ];
479
505
}
480
506
@@ -590,7 +616,7 @@ - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
590
616
[mutableRequest setValue: @" application/x-www-form-urlencoded" forHTTPHeaderField: @" Content-Type" ];
591
617
}
592
618
// NSData *HTTPBody
593
- // 设置请求体 编码后的NSData (NSUTF8StringEncoding默认编码方式)
619
+ // 设置请求体 一段query串编码后的NSData (NSUTF8StringEncoding默认编码方式)
594
620
[mutableRequest setHTTPBody: [query dataUsingEncoding: self .stringEncoding]];
595
621
}
596
622
@@ -837,6 +863,7 @@ - (void)appendPartWithInputStream:(NSInputStream *)inputStream
837
863
[self .bodyStream appendHTTPBodyPart: bodyPart];
838
864
}
839
865
866
+ // form-data拼接文件参数
840
867
- (void )appendPartWithFileData : (NSData *)data
841
868
name : (NSString *)name
842
869
fileName : (NSString *)fileName
@@ -853,6 +880,7 @@ - (void)appendPartWithFileData:(NSData *)data
853
880
[self appendPartWithHeaders: mutableHeaders body: data];
854
881
}
855
882
883
+ // form-data拼接一般请求参数
856
884
- (void )appendPartWithFormData : (NSData *)data
857
885
name : (NSString *)name
858
886
{
@@ -868,14 +896,15 @@ - (void)appendPartWithHeaders:(NSDictionary *)headers
868
896
body : (NSData *)body
869
897
{
870
898
NSParameterAssert (body);
871
-
899
+ // 表单必要的数据组装
872
900
AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc ] init ];
873
901
bodyPart.stringEncoding = self.stringEncoding ;
874
902
bodyPart.headers = headers;
875
903
bodyPart.boundary = self.boundary ;
876
904
bodyPart.bodyContentLength = [body length ];
877
905
bodyPart.body = body;
878
-
906
+
907
+ // 将需要的bodyPart模块保存到数组中
879
908
[self .bodyStream appendHTTPBodyPart: bodyPart];
880
909
}
881
910
@@ -892,9 +921,12 @@ - (NSMutableURLRequest *)requestByFinalizingMultipartFormData {
892
921
}
893
922
894
923
// Reset the initial and final boundaries to ensure correct Content-Length
924
+ // 重设边界 保证正确的Content-Length
895
925
[self .bodyStream setInitialAndFinalBoundaries ];
926
+ // 设置HTTPBodyStream
896
927
[self .request setHTTPBodyStream: self .bodyStream];
897
928
929
+ // 设置请求头
898
930
[self .request setValue: [NSString stringWithFormat: @" multipart/form-data; boundary=%@ " , self .boundary] forHTTPHeaderField: @" Content-Type" ];
899
931
[self .request setValue: [NSString stringWithFormat: @" %llu " , [self .bodyStream contentLength ]] forHTTPHeaderField: @" Content-Length" ];
900
932
0 commit comments