我在正确设置请求的HTTPBody时遇到问题。我正在使用Oauth与我们的API服务器进行通信,唯一的区别是,我需要通过正文而不是标头发送数据(使用OauthConsumer.framework - http://code.google.com/p/oauthconsumer/wiki/UsingOAuthConsumer)。
这是我的代码:
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 realm =“”,oauth_consumer_key =“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 :(得分: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];
请注意,您的额外参数需要以“&”分隔太
答案 1 :(得分:0)
看起来oauth_signature没有正确编码(百分号仍在那里)。而不是[signature URLEncodedString]
试试这个:
[signature stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
看看它是否有所不同。
答案 2 :(得分:0)
好吧,我愚蠢到没注意到我们的API使用"&"而不是","将密钥彼此分开。问题解决了。