在AFNetworking 2.x的设定自定义首部之后,将参数不被由具有REST API接收

问题描述:

我随后在AFNetworking 2.0 add headers to GET request建议的解决方案,以用于与下面的代码段的请求指定自定义标头:在AFNetworking 2.x的设定自定义首部之后,将参数不被由具有REST API接收

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
[manager.requestSerializer setValue:someID forHTTPHeaderField:@"some_id"]; 
NSDictionary *parameters = @{@"id": user.id, @"birthday": user.birthday}; 
[manager POST:[NSString stringWithFormat:@"%@/user_create",BaseURLString] parameters:parameters 
success:^(AFHTTPRequestOperation *operation, id responseObject) 
{ 
    if (responseObject[@"error"]) 
    { 
     NSLog(@"REST User Create Response Error: %@", responseObject[@"error"]); 
    } 
    else 
    { 
     [self saveUserDetails:responseObject]; 
    } 
} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) 
{ 
    NSLog(@"REST User Create Error: %@", error); 

}]; 

但是当这个被执行的时候会发生什么,我从API的响应中得到一个错误,说明我的所有参数都丢失了。以前使用的同一代码块(无需设置自定义标头,并且API最初不需要它们)。

有谁知道如何正确设置自定义标题和POST参数吗?

感谢, 尼诺

我发现我应该将我的请求序列化器设置为以下代码,因为我的API不需要JSON格式的参数。

manager.requestSerializer = [AFHTTPRequestSerializer serializer]; 

希望这可以帮助其他人处理与我一样的情况。

您的代码看起来好像没什么问题。

有几件事情尝试:

  1. 尝试使用AFNetworkActivityLogger看到实际上正在发送的(将其设置为AFLoggerLevelDebug。)您也可以使用像Charles Web代理或协议分析仪一样Wireshark
  2. 如果您确定数据未被正确发送,请在[AFURLRequestSerialization -requestBySerializingRequest:withParameters:error:]中设置一个断点。这是您的HTTP标头和参数添加到URL请求的地方。该方法非常简单;你应该能够一步一步看着东西被添加到请求并确定它被跳过的原因。

    注意: AFURLRequestSerialization.m包含AFURLRequestSerialization的多个子类。在超级实现中以及在AFJSONRequestSerializer实现中设置断点。

    例子,可能会导致此行为:

    • parametersnil
    • 您已经添加到POSTHTTPMethodsEncodingParametersInURI
      • 你的API是不准备处理附加到URL上的POST请求参数,或
      • queryStringSerializationnilqueryStringSerializationStyle被设置为AFHTTPRequestQueryStringDefaultStyle其他的东西。
    • NSJSONSerialization无法处理您的parameters字典

一个侧面说明(无关你的问题),如果使用AFHTTPRequestOperationManager的initWithBaseURL:方法,并保持强引用您的经理,你将不必这样做[NSString -stringWithFormat:]东西来构建您的网址。