在 AFNetworking 2.x 中设置自定义标头后,RESTful API 未接收到参数

Posted

技术标签:

【中文标题】在 AFNetworking 2.x 中设置自定义标头后,RESTful API 未接收到参数【英文标题】:After setting custom headers in AFNetworking 2.x, the parameters are not being received by the RESTful API 【发布时间】:2013-12-15 12:38:15 【问题描述】:

我按照AFNetworking 2.0 add headers to GET request 的建议解决方案使用以下代码 sn-p 为请求指定自定义标头:

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 参数吗?

谢谢, 尼诺

【问题讨论】:

【参考方案1】:

你的代码在我看来不错。

有几件事可以尝试:

    尝试使用AFNetworkActivityLogger 查看实际发送的内容(将其设置为AFLoggerLevelDebug。)您还可以使用Charles 之类的网络代理或Wireshark 之类的协议分析器。

    如果您确定数据未正确发送,请在[AFURLRequestSerialization -requestBySerializingRequest:withParameters:error:] 中设置断点。这是将 HTTP 标头和参数添加到 URL 请求的位置。该方法非常简单;您应该能够单步执行并观察添加到请求中的内容并确定它被跳过的原因。

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

    可能导致此行为的示例:

    parametersnil。 您已将POST 添加到HTTPMethodsEncodingParametersInURI 但 您的 API 未准备好处理附加到 POST 请求中的 URL 的参数,或者 queryStringSerialization 块是 nil 并且 queryStringSerializationStyle 设置为 AFHTTPRequestQueryStringDefaultStyle 以外的其他值。 NSJSONSerialization 无法处理您的 parameters 字典

附带说明(与您的问题无关),如果您使用 AFHTTPRequestOperationManager 的 initWithBaseURL: 方法,并保持对您的经理的强烈参考,您将不必这样做 [NSString -stringWithFormat:] 的东西来构建您的 URL。

【讨论】:

【参考方案2】:

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

manager.requestSerializer = [AFHTTPRequestSerializer serializer];

希望这有助于其他人处理与我相同的情况。

【讨论】:

以上是关于在 AFNetworking 2.x 中设置自定义标头后,RESTful API 未接收到参数的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中设置自定义 NavigationBar 的最简单方法是啥?

无法在 Web api 配置中设置自定义合同解析器

如何在 iOS 中设置自定义属性? [复制]

在自定义单元格中设置自定义附件类型

无法在 WorkManager 中设置自定义工人工厂

如何在 alamofire 5.0.2 版本中设置自定义超时