【问题标题】:setHTTPBody sending incorrect data in NSMUtableURLRequestsetHTTPBody 在 NSMUtableURLRequest 中发送不正确的数据
【发布时间】:2012-06-27 09:57:39
【问题描述】:

我在正确设置请求的 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-" , oauth_version="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_versionFD0781" ="1.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"] => 字符串(9)“HMAC-SHA1”[“oauth_timestamp”]=> 字符串(10)“1340717947”[“oauth_version”]=> 字符串(3)“1.0”[“oauth_signature”]=> 字符串(28) "Q1Ac4eF690stWrvaOCi0knxThjY="}

标签: objective-c nsmutableurlrequest


【解决方案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];

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

【讨论】:

    【解决方案2】:

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

    [signature stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
    

    看看有没有什么不同。

    【讨论】:

    • 不,不是这样。问题是服务器接收到的数组是 1 个对象,但它应该是数组(7)。 OAuth_realm 被视为第一个元素的键,但其值是接收到的字符串的其余部分。
    【解决方案3】:

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

    【讨论】:

    • 这正是我在回答中写的,也许你可以接受?
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多