【问题标题】:Using NSDictionary for HTTP POST requests with identical keys将 NSDictionary 用于具有相同键的 HTTP POST 请求
【发布时间】:2012-11-08 19:55:02
【问题描述】:

我有一个应用程序可以向用户显示一些消息。我需要通知服务器用户已阅读消息。为此,我需要向 /api/mark_as_read/ 发送一个 HTTP POST 请求,其中包含要标记为已读的消息 ID,例如:

ID: 1234
ID: 5678
ID: 90AB

请注意,HTTP 规范允许可能存在重复的密钥,API 在这种情况下使用这些密钥。

我目前正在使用 AFHTTPClient(AFNetworking 库的一部分)。 POST 参数作为 NSDictionary 传递给 AFHTTPClient,当然它具有唯一的键,这意味着我只能传入一个名为“ID”的值。

我已经寻找了一段时间的解决方案,但无法挖掘任何东西。但我相信很多人之前都遇到过这个问题。如何在 Objective-C 中向我的 HTTP 客户端传递具有非唯一键的字典?

更新 - 我能够通过更新 AFNetworking 库并将一组 ID 放入一个 NSDictionary 值来解决问题。 (见下文。)

【问题讨论】:

  • 是否可以更改 API 以处理逗号分隔的字符串?因此您可以发送 ID 字符串,例如 1234,5678,90AB....等
  • 传递给服务的数据必须是字典吗?您可以使用 JSON 发送您的键值对吗?
  • @Kassem 我无法更改 API,否则我会这样做。
  • @propstm 它必须被编码为multipart/form-data,所以我认为 JSON 不会在这里工作。
  • 你不能手动构建帖子正文吗?

标签: objective-c http http-post nsdictionary afnetworking


【解决方案1】:

尝试为值传递一个数组:

NSArray *values = [NSArray arrayWithObjects:@"1234", @"5678", @"90AB", nil]; 
NSDictionary *params = [NSDictionary dictionaryWithObjectAndKey:values, @"ID"];

【讨论】:

  • 这不行,它只是将[values description] 的输出作为单个ID 字段发送。
  • @Aaron 如果是这种情况,那么您要么使用的是非常旧的 AFNetworking 版本,要么实际上没有使用 AFHTTPClient 中的参数序列化。
  • @mattt 我更新了 AFNetworking,现在更接近了。我的 HTTP POST 正文现在看起来像 id[]=795918%3A2122194149&id[]=795919%3A2122919993&id[]=795919%3A2122919702&id[]=795919%3A2122919678&id[]=795919%3A2122919765&id[]=795919%3A2122919762。我看到[] 字符被添加到AFHTTPClient 的AFQueryStringPairsFromKeyAndValue 方法中。 [] 是 HTTP 规范的一部分吗?如果我将其删除以用于此 API 是否可以?
  • @Aaron 随心所欲,或者随意手动进行参数编码并手动设置 URL 的查询。
【解决方案2】:

字典是一个集合,键是唯一的'定义' 用标准的dict是不可能做到的

但是可以继承 set 并且只使用 keys 数组和 dups 数组。 afnetwork 会将其用作字典,并提供您想要的输出。

他们可能有这样的课程,或者您可以轻松编写类似的课程 http://cocoaheads.byu.edu/code/CHDataStructures

**这是低效的,只能用于此目的**

【讨论】:

  • 在这种特殊情况下,奇异的数据结构是一个红鲱鱼。它不需要比将键设置为 id 数组更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多