我正在尝试使用RestSharp从我的Web应用程序发布Twitter状态。以下代码完美地运行:
然而,如果我在状态文本中包含以下任何字符:
通过大量的论坛搜寻,我推断出这与OAuth签名编码不匹配POST参数的编码有关。我在这个SO问题中发现了一些信息,但在GitHub上搜索RestSharp问题并没有找到有用的内容。
我可以看到RestSharp源代码中的一些代码(
但这也不起作用(我仍然收到身份验证错误)。
实际上问题是什么,我应该如何正确编码状态?或者这是RestSharp的一个bug吗?
var status = "I am fine with posting this status.";
var client = new RestClient("https://api.twitter.com");
// The OAuth keys/tokens/secrets are retrieved elsewhere
client.Authenticator = OAuth1Authenticator.ForProtectedResource(
_consumerKey, _consumerSecret, _accessToken, _accessTokenSecret
);
var request = new RestRequest("/1.1/statuses/update.json", Method.POST);
request.AddParameter("status", status, ParameterType.GetOrPost);
var response = client.Execute(request);
然而,如果我在状态文本中包含以下任何字符:
! * ' ( )
,则此代码会出现身份验证错误。通过大量的论坛搜寻,我推断出这与OAuth签名编码不匹配POST参数的编码有关。我在这个SO问题中发现了一些信息,但在GitHub上搜索RestSharp问题并没有找到有用的内容。
我可以看到RestSharp源代码中的一些代码(
UrlEncodeRelaxed
),它似乎是手动编码特定字符集以符合OAuth编码规范,因此我尝试以相同方式手动编码我的状态中的这些字符(使用取自RestSharp的代码)后再传递它,例如:var status = "I'm NOT fine with posting this status.";
string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" };
string[] UriRfc3968EscapedHex = new[] { "%21", "%2A", "%27", "%28", "%29" };
for (var i = 0; i < UriRfc3986CharsToEscape.Length; i++)
status = status.Replace(UriRfc3986CharsToEscape[i], UriRfc3968EscapedHex[i]);
但这也不起作用(我仍然收到身份验证错误)。
实际上问题是什么,我应该如何正确编码状态?或者这是RestSharp的一个bug吗?