0

我在正确设置请求的 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 领域="",oauth_consumer_key="key",oauth_signature_method="HMAC-SHA1",oauth_signature="HT2UwJoW4dSNh1gXkAzQThLp0Sk%3D",oauth_timestamp="1340789377",oauth_nonce="3BDF0A1A-4FB0-40EF-95EA-5CBB88" “1.0”

这就是服务器读取的内容,为什么数组是错误的?这不是服务器端的错误,我们的 C# 客户端没有任何问题。

数组(1){
  [“OAuth_realm”]=>
  字符串(215) """, oauth_consumer_key="key", oauth_signature_method="HMAC-SHA1", oauth_signature="HT2UwJoW4dSNh1gXkAzQThLp0Sk=", oauth_timestamp="1340789377", oauth_nonce="3BDF0A1A-4FB0-40EF-95EA-5CBauth_versionFD071" ="1.0""
}
4

3 回答 3

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];

请记住,您的额外参数也需要用“&”分隔。

于 2012-06-27T11:39:41.997 回答
0

好吧,我很愚蠢,没有注意到我们的 API 使用“&”而不是“,”来分隔键。问题解决了。

于 2012-06-27T11:52:37.833 回答
0

看起来 oauth_signature 没有正确编码(百分号仍然存在)。而不是[signature URLEncodedString]试试这个:

[signature stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

看看是否有什么不同。

于 2012-06-27T10:28:08.773 回答