【发布时间】:2013-03-29 12:13:10
【问题描述】:
我正在尝试使用 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 参数的编码不匹配有关。我找到了this question on SO,但在 GitHub 上搜索 RestSharp 问题并没有发现任何帮助。
我可以看到some code in the RestSharp source (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 错误?
【问题讨论】:
-
您找到解决方案或解决方法了吗?我现在正在努力解决这个问题。
-
@Michael_B 不,抱歉:我开始研究它,但没走多远,其他优先事项就出现了。
-
我最终使用 Linq2Twitter 进行状态更新。它适用于 Twitter API 的 v1.1。我从来没有找到解决 RestSharp 的 OAuth 问题的方法。
标签: c# oauth twitter twitter-oauth restsharp