2012-06-27 67 views
0

發送不正確的數據我有正確設定請求的HTTPBody的問題。我使用OAuth與我們的API服務器進行通信,唯一的區別是,我需要的,不是頭(使用OauthConsumer.framework - http://code.google.com/p/oauthconsumer/wiki/UsingOAuthConsumer)通過身體發送數據。setHTTPBody在NSMUtableURLRequest

這是我的代碼:

NSString *oauthHeader = [NSString stringWithFormat:@"OAuth realm=\"%@\", oauth_consumer_key=\"%@\", %@oauth_signature_method=\"%@\", oauth_signature=\"%@\", oauth_timestamp=\"%@\", oauth_nonce=\"%@\", oauth_version=\"1.0\"%@", 
         [realm URLEncodedString], 
         [consumer.key URLEncodedString], 
         oauthToken, 
         [[signatureProvider name] URLEncodedString], 
         [signature URLEncodedString], 
         timestamp, 
         nonce, 
         extraParameters]; 

//[self setValue:oauthHeader forHTTPHeaderField:@"Authorization"]; 
NSLog(@"%@", oauthHeader); 
[self setHTTPBody:[oauthHeader dataUsingEncoding:NSASCIIStringEncoding]]; 

這就是NSLog的輸出。

OAuth的境界= 「」,oauth_consumer_key = 「鍵」,oauth_signature_method = 「HMAC-SHA1」,oauth_signature = 「HT2UwJoW4dSNh1gXkAzQThLp0Sk%3D」,oauth_timestamp = 「1340789377」,oauth_nonce =「3BDF0A1A-4FB0-40EF-95EA-5CB8B0FD07C1 」 oauth_version =‘1.0’

而這正是服務器讀取,爲什麼數組是錯誤的?這不是服務器端錯誤,我們的C#客戶端沒有任何問題。

array(1) { 
    ["OAuth_realm"]=> 
    string(215) """, oauth_consumer_key="key", oauth_signature_method="HMAC-SHA1", oauth_signature="HT2UwJoW4dSNh1gXkAzQThLp0Sk=", oauth_timestamp="1340789377", oauth_nonce="3BDF0A1A-4FB0-40EF-95EA-5CB8B0FD07C1", oauth_version="1.0"" 
} 
+0

這是服務器從Windows客戶端接收到的內容:

array(7) { ["app_status"]=> string(67) "{"downloads":[],"application":{"status":"Idle","transfer_speed":0}}" ["oauth_consumer_key"]=> string(40) "1e98d7a0b09c4a155b78cdb5ca09bee309355bb7" ["oauth_nonce"]=> string(8) "91942949" ["oauth_signature_method"]=> string(9) "HMAC-SHA1" ["oauth_timestamp"]=> string(10) "1340717947" ["oauth_version"]=> string(3) "1.0" ["oauth_signature"]=> string(28) "Q1Ac4eF690stWrvaOCi0knxThjY="}
Thunder

回答

1

這個問題似乎是,你不要在不同的鍵 - 值對彼此分開。這簡直是​​用「&」(不帶引號)連接起來將完成。您在鍵值關聯之間設置逗號。
此外你不需要,除非你想這些報價是在接收器邊的價值的一部分引號內封裝的值。然後

你得到的數據字符串應該是這樣的:

NSString *oauthHeader = [NSString stringWithFormat:@"OAuth_realm=%@&oauth_consumer_key=%@&%@oauth_signature_method=%@&oauth_signature=%@&oauth_timestamp=%@&oauth_nonce=%@&oauth_version=1.0%@", 
        [realm URLEncodedString], 
        [consumer.key URLEncodedString], 
        oauthToken, 
        [[signatureProvider name] URLEncodedString], 
        [signature URLEncodedString], 
        timestamp, 
        nonce, 
        extraParameters]; 

請記住,你的extraparameters需要由「&」分開了。

0

看起來oauth_signature編碼不正確(百分號仍然存在)。取而代之的[signature URLEncodedString]試試這個:

[signature stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 

,看看它是否有什麼差別。

+0

不,那不是。問題是服務器接收的數組是1個對象,但它應該是數組(7)。 OAuth_realm被視爲第一個元素的關鍵字,但其值是接收到的字符串的其餘部分。 – Thunder

0

好的,我很笨,沒有注意到我們的API使用「&」而不是「,」來將鍵彼此分開。問題解決了。

+0

這正是我在我的答案中寫的,也許你可以接受它? – TRD