NSMutableURLRequest 设置 HttpBody 移除 Header Parameters

NSMutableURLRequest set HttpBody remove the Header Parameters

我试图在 Objective-C 中的 POST 请求上传递两个不同的参数。

第一个参数应该放在 Header 上,另一个应该放在 Body 上。

NSDictionary *headerParams = [NSDictionary dictionaryWithObjectsAndKeys:
                                    @"password", @"grant_type",
                                    @"write", @"scope", nil];
NSDictionary *bodyParams = [NSDictionary dictionaryWithObjectsAndKeys:
                                    username, @"username",
                                    password, @"password", nil];
AFHTTPRequestSerializer *r = [AFHTTPRequestSerializer serializer];
NSError *error = nil;

NSData *requestBody = [NSKeyedArchiver archivedDataWithRootObject:bodyParams];

NSMutableURLRequest *request = [r requestWithMethod:@"POST" URLString:urlString parameters:headerParams error:&error];
[request setValue:[NSString stringWithFormat:@"application/json,application/x-www-form-urlencoded"] forHTTPHeaderField:@"Accept"];
[request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded"] forHTTPHeaderField:@"ContentType"];
[request setHTTPBody: requestBody]; //--> If I comment this, the headerParams doesn't removed

如果我用这条语句调试上面的代码:

po [[NSString alloc] initWithData: request.HTTPBody encoding:4]

我得到了nil。但是当我省略 [request setHTTPBody: requestBody]; 的部分时,我得到了 headerParams 的值。我想同时获得 headerParamsbodyParams 的值。怎么了?谢谢。

通过查看关于 parameters 参数的 documentation for AFHTTPRequestSerializer

parameters
The parameters to be either set as a query string for GET requests, or the request HTTP body.

您认为会转到请求的 headers 的字典实际上会转到它的 body。代码最后一行的 setHTTPBody: 调用将覆盖此值。

如果您希望第一个 headerParams 字典转到请求 headers,您需要使用 setValue:forHTTPHeaderField:.