2010-09-24 69 views
6

嘿,我需要使用NSDictionary對象數組發出HTTP POST請求。如何使用ASIFormDataRequest將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]; 

這是它的外觀時,它是在服務器上反序列化(軌道)側:

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中更復雜的數據結構傳遞給webservices的常見方法是使用json。

還有這裏的iphone一個JSON庫:

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

和Ruby on Rails的已建成JSON支持。

+0

感謝您的答覆。我知道JSON是一個選項,但是散列(地圖)的唯一方式是作爲後期參數發送的嗎? – amehta 2010-09-24 05:11:44

+1

您可以使用SOAP或純XML來代替,但我認爲JSON是更簡單的選項。在一天結束時,一個http POST只是發送(幾乎)自由文本到服務器。如果它只是一個簡單的單個字典,那麼正如我所提到的,您可以爲每個鍵/值調用addPostValue(或修改ASIHTTPRequest,以便接受字典並添加每個鍵/值),但對於更復雜的任何事情,您需要一些構成數據轉換爲客戶端和服務器支持的定義格式的字符串 - json是最簡單的常見方式。 – JosephH 2010-09-24 05:39:25

+0

好的。我希望有一個非JSON/XML/SOAP/YAML的方式。我的意思是,當我調用addPostValue時 - 我添加了一個鍵值對。所以,直覺上,我認爲*值*可能是另一個哈希。另外,當我調用addPostValue時 - 它似乎允許我發送一個數組作爲參數(如我在發佈的服務器日誌中看到的那樣),所以對我來說應該也支持Hash對象。我猜不會。 – amehta 2010-09-24 05:48:52

0

你可以做這樣的事情

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

相關問題