我正在尝试使用RestSharp从我的网络应用程序发布 Twitter 状态。以下代码完美运行:
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
代码(来自 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 错误?