如何使用ASIFormDataRequest来对NSDictionary对象的http post数组

时间:2010-09-24 04:03:36

标签: iphone objective-c ios ruby-on-rails asihttprequest

嘿,我需要使用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)

我确信这是人们面临的常见问题。所以肯定有一个解决方案。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

这里有一个iphone的json库:

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

和ruby on rails内置了json支持。

答案 1 :(得分:0)

你可以做这样的事情

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