Как использовать ASIFormDataRequest для массива http post объектов NSDictionary - PullRequest
6 голосов
/ 24 сентября 2010

Эй, мне нужно сделать HTTP-запрос POST с массивом объектов NSDictionary.

Однако, когда я делаю это, на стороне сервера я замечаю, что объект 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 ]

2 голосов
/ 24 сентября 2010

Во-первых, чтобы объяснить, что вы видите:

Метод addPostValue предназначен для приема одного значения и вызывает [value description] для преобразования этого значения в строку. Метод description дает строковое представление, которое вы видите на стороне сервера (метод description также вызывается NSLog, если вы передаете ему объект, поэтому формат должен выглядеть довольно знакомым). Таким образом, iphone получил запрос на отправку строки, и он делает это, и сервер «правильно» показывает это в виде строки.

Если вы просто хотите отправить один контакт, просто вызовите addPostValue для каждой пары ключ / значение - т.е. один раз для телефона, снова для электронной почты и т. д.

Если вы хотите передать несколько контактов, возможно, вам нужно что-то лучше. Я не очень знаком с ruby-on-rails, поэтому могут быть и другие решения, но, безусловно, распространенный способ передачи более сложных структур данных на веб-сервисы с iphone - это использование json.

Здесь есть библиотека json для iphone:

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

и ruby ​​on rails имеет поддержку json.

0 голосов
/ 02 декабря 2013

вы можете сделать что-то вроде этого

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

...