2010-09-24 1 views
6

Эй, мне нужно сделать запрос HTTP POST с массивом объектов NSDictionary.Как использовать ASIFormDataRequest для http post array объектов 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]; 

Вот как это выглядит, когда он десериализируется на сервере (рельсы) сторона:

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

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

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

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

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

Там есть библиотека JSON для Iphone здесь:

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

и рубин на рельсах имеет встроенную поддержку JSON.

+0

Спасибо за ответ. Я понимаю, что JSON - это вариант, но только, что хеши (карты) отправляются только как параметры сообщения? – amehta

+1

Вместо этого вы можете использовать SOAP или простой XML, но я бы рассмотрел более простой вариант JSON. В конце дня http POST просто отправляет (почти) текст свободной формы на сервер. Если это простой простой словарь, то, как я уже говорил, вы можете вызвать addPostValue для каждого ключа/значения (или изменить ASIHTTPRequest, чтобы он принимал словарь и добавлял каждый ключ/значение), но для чего-то более сложного вам нужно что-то, что структурирует данных в строку с определенным форматом, который поддерживает как клиент, так и сервер. json - это самый простой общий способ сделать это. – JosephH

+0

Хорошо. Я надеялся, что существует способ не JSON/XML/SOAP/YAML. Я имею в виду, когда я вызываю addPostValue - добавляю пару значений ключа. Итак, интуитивно, я понял, что * значение * может быть другим хэшем. Кроме того, когда я вызываю addPostValue - похоже, он позволяет мне отправлять массив в качестве параметра (как видно из журнала сервера, который я опубликовал), поэтому мне казалось, что объект Hash также должен поддерживаться. Наверное, нет. – amehta

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^