2012-06-27 29 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