setHTTPBody在NSMUtableURLRequest中发送不正确的数据

时间:2012-06-27 09:57:40

标签: objective-c nsmutableurlrequest

我在正确设置请求的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""
}

3 个答案:

答案 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使用"&"而不是","将密钥彼此分开。问题解决了。