6

嘿,我需要使用一组 NSDictionary 对象发出 HTTP POST 请求。

但是,当我这样做时,我在服务器端注意到 NSDictionary 对象没有反序列化为哈希。它被反序列化为一个字符串——这不是我想要的。

这就是我从客户端(iPhone)端发送参数的方式:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
for (ABContact *c in contactsWithEmailsOrPhones){
  NSString *phoneNumber = [[ABContactsHelper class] contactPhoneNumber:c];
  NSString *email = [[c emailArray] objectAtIndex:0];
  NSLog(@"looping: %@, %@", phoneNumber, email);
  NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                         phoneNumber,
                         @"phone", 
                         email,
                         @"email", 
                         [c firstname],
                         @"firstname",
                          [c lastname],
                          @"lastname", nil];

    [request addPostValue:dict forKey:@"contacts[]"];
}

[request setDelegate:self];
[request startAsynchronous];

这是在服务器(rails)端反序列化时的样子:

Started POST "/app/find_friends" for 67.164.97.48 at Thu Sep 23 14:40:37 -0700 2010
Processing by app#find_friends as HTML
Parameters: {"contacts"=>["{\n    email = \"xx\";\n    firstname = xx;\n    lastname = xx;\n    phone = \"xx\";\n}", "{\n    email = \"xx\";\n    firstname = xx;\n    lastname = xx;\n    phone = \"xx\";\n}"]}
Completed 200 OK in 0ms (Views: 0.3ms | ActiveRecord: 0.0ms)

我相信这是人们面临的普遍问题。所以肯定有一个解决方案。

提前感谢所有评论/答案。

4

2 回答 2

2

首先,解释一下你所看到的:

addPostValue 方法旨在获取单个值,并调用 [value description] 将该值转换为字符串。description 方法给出了一个字符串表示,这就是您在服务器端看到的(如果您将对象传递给它,那么 description 方法也是 NSLog 调用的,因此格式应该看起来很熟悉)。所以iphone被要求发送一个字符串,并且这样做了,服务器“正确地”将它显示为一个字符串。

如果您只想发送一个联系人,那么只需为每个键/值对调用“addPostValue” - 即。一次用于电话,再次用于电子邮件等。

如果你想传递多个联系人,你可能需要更好的东西。我对 ruby​​-on-rails 不是很熟悉,所以可能还有其他解决方案,但从 iphone 将更复杂的数据结构传递给 web 服务的常见方法当然是使用 json。

这里有一个 iphone 的 json 库:

http://code.google.com/p/json-framework/

并且 ruby​​ on rails 内置了 json 支持。

于 2010-09-24T04:38:32.417 回答
0

你可以做这样的事情

[request setPostValue:login forKey:@"user[login]"]; [request setPostValue:password forKey:@"user[password]"];

于 2013-12-02T07:49:53.620 回答