【问题标题】:AFNetworking serializes forward slash making the JSON payload invalidAFNetworking 序列化正斜杠使 JSON 有效负载无效
【发布时间】:2015-10-09 03:03:55
【问题描述】:

我正在使用AFNetworking 2.0。

AFNetworkingAFHTTPRequestOperationManager 对象有一个API:

(AFHTTPRequestOperation *)POST:(NSString *)URLString
                    parameters:(id)parameters
                       success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

它接受 NSDictionary 作为我们希望“发布”到服务器的 JSON 有效负载的参数。在我的有效负载中,我有以下键值对:

"buttonActionParam":"/catalog/special/international-calling"

发布此有效负载服务器会返回无效的 JSON。查看服务器端的有效载荷,我意识到 AFNetworking 实际上是在发送:

"buttonActionParam":"\/catalog\/special\/international-calling".

我知道AFNetworking 库使用NSJSONSerialization 的类方法-dataWithJSONObject:,导致了这种情况。我的问题是:

问。如何解决这个问题?

【问题讨论】:

  • 不确定我是否理解这个问题:您是说您正在尝试发送“buttonActionParam”:“/catalog/special/international-calling”,而这正是发送的内容AFNetworking,有什么问题?
  • 编辑了我的问题。不得不放转义字符。 :)
  • 来自NSJSONSerializationNSData 与您在服务器端看到的不太一样——它在我的十六进制编辑器中显示{"buttonActionParam":"\/catalog\/special\/international-calling"}。我想知道这是否是字符编码问题 - 看起来服务器出于某种原因坚持了额外的转义 \。
  • @RichTolley 我编辑了来自 NSJSONSerialization 的内容。我正在寻找 {"buttonActionParam":"/catalog/special/international-calling"} 而不是 {"buttonActionParam":"\/catalog\/special\/international-calling"}

标签: ios objective-c json afnetworking-2


【解决方案1】:

这是已知问题。它实际上按设计运行(请参阅https://stackoverflow.com/a/20448342/669586)。

有3种可能的解决方案:

  1. 让您的服务器意识到字符串可能被转义。一般来说,这是最好的解决方案。

  2. 使用不同的 JSON 编码器(例如 SBJson)并将对象编码为 NSData,而不是使用 AFNetworking 默认序列化程序。

  3. 使用NSJSONSerialization 进行编码,然后将生成的数据转换为NSString(使用NSUTF8StringEncoding),对其进行清理并将其转换回NSData。同样,您必须在将对象提供给 AFNetworking 之前执行此操作。

实现 2 或 3 的最佳方法是在 AFHTTPSessionManager 实例上设置自定义 requestSerializer。例如,请参阅this answer 了解实现 3 的示例(注意它是在 Swift 中)。

【讨论】:

  • #2 仅在 AFNetworking 之后使用 SBJson 时才有效。 #3 我在发布之前尝试过。不工作。我会尝试#1。
  • @DeborshiSaha 不,主要是关于如何设置序列化程序。如果你不让 AFNetworking 使用它的默认请求序列化器(它使用NSJSONSerialization),那么你没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2018-08-22
相关资源
最近更新 更多