POST请求与AFNetworking 2.0不起作用,但在HTTP请求testing器工作

我刚开始使用新的AFNetworking 2.0 API,现在已经使用了以前的版本。 我试图做一个标准的http POST request ,但可悲的是我不太好。 这是我现在的代码:

 AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager]; NSDictionary *parameters = @{@"username" : self.usernameField.text, @"password" : self.passwordField.text}; [operationManager POST:@"https:URL GOES HERE" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", [responseObject description]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

现在这返回一个JSON(NULL) ,并没有给我一个像404或什么的状态代码(顺便说一句,我们如何获得使用AFN 2.0时的状态代码?)。 但是,当我尝试使用像apikitchen.com这样的Web应用程序来testingHTTP Post request的信息时,它将工作,当我把用户名和密码在param字段。 所以真的我的问题是,为什么AFN 2.0 parameter property中的parameters与Web应用程序中的parameters行为方式相同? 更一般的是,为什么AFN 2.0post request parameters不适合我?

我在这里先向您的帮助表示感谢,
麦克风

编辑:我很努力与build议的修复的实施。 我的post方法现在看起来像这样,但现在对我来说没有任何意义。

 AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager]; NSDictionary *parameters = @{@"username" : self.usernameField.text, @"password" : self.passwordField.text}; operationManager.requestSerializer.queryStringSerializationWithBlock = ^NSString*(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) { NSString* encodedParams = form_urlencode_HTTP5_Parameters(parameters); return encodedParams; }; [operationManager POST:@"URL HERE" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", [responseObject description]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

现在这返回一个JSON的(空),并没有给我一个像404或什么的状态代码(顺便说一句,我们如何获得使用AFN 2.0时的状态代码?)。

至less应该给出一个错误。 失败处理程序打印出来什么?

所以真的我的问题是,为什么AFN 2.0参数属性中的参数与Web应用程序中的参数的行为方式相同? 更一般的是,为什么AFN 2.0中的发布请求参数不适合我?

在检查AFN(版本2.0.1)如何对参数进行编码之后,在我看来,它们不是应该编码的: 应用程序/ x-www-form-urlencoded编码algorithm 。

在此问题解决之前,您可以尝试以下解决方法。 以下algorithm严格按照W3C针对HTTP 5的build议对参数进行编码,至less对于我testing过的Mac OS X 10.8来说:

 static NSString* form_urlencode_HTTP5_String(NSString* s) { CFStringRef charactersToLeaveUnescaped = CFSTR(" "); CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~"); NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (__bridge CFStringRef)s, charactersToLeaveUnescaped, legalURLCharactersToBeEscaped, kCFStringEncodingUTF8)); return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"]; } 

(注意:上面的代码取决于函数CFURLCreateStringByAddingPercentEscapes的实现细节,完全可以轻松实现build议的algorithm,没有任何依赖关系,我build议 – 这样做不会那么简单。)

 static NSString* form_urlencode_HTTP5_Parameters(NSDictionary* parameters) { NSMutableString* result = [[NSMutableString alloc] init]; BOOL isFirst = YES; for (NSString* name in parameters) { if (!isFirst) { [result appendString:@"&"]; } isFirst = NO; assert([name isKindOfClass:[NSString class]]); NSString* value = parameters[name]; assert([value isKindOfClass:[NSString class]]); NSString* encodedName = form_urlencode_HTTP5_String(name); NSString* encodedValue = form_urlencode_HTTP5_String(value); [result appendString:encodedName]; [result appendString:@"="]; [result appendString:encodedValue]; } return [result copy]; } 

然后,在使用AFN时,可以自定义序列化algorithm,如下所示:

  AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager]; operationManager.requestSerializer.queryStringSerializationWithBlock = ^NSString*(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) { NSString* encodedParams = form_urlencode_HTTP5_Parameters(parameters); return encodedParams; }; 

放在/之后的url。 我已经错过了好几个小时了。