Tôi đang cố đăng trạng thái Twitter từ ứng dụng web của mình, sử dụng RestSharp. Các mã sau hoạt động hoàn hảo:RestSharp và Twitter API 1.1: Làm thế nào để tôi có văn bản cập nhật trạng thái URLEncode chính xác?
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);
Tuy nhiên, mã này không thành công với một lỗi xác thực nếu tôi bao gồm bất kỳ các ký tự sau trong văn bản trạng thái: ! * ' ()
Qua một nhiều of this forum lưới vét, tôi đã suy luận rằng đây là một cái gì đó để làm với mã hóa chữ ký OAuth không phù hợp với mã hóa của các tham số POST. Tôi tìm thấy this question on SO, nhưng tìm kiếm các vấn đề RestSharp trên GitHub cho thấy không có gì hữu ích.
Tôi có thể thấy some code in the RestSharp source (UrlEncodeRelaxed
) dường như mã hóa thủ công bộ ký tự cụ thể đó để tuân thủ thông số mã hóa OAuth, vì vậy tôi đã cố gắng mã hóa thủ công các ký tự đó trong trạng thái của tôi theo cách tương tự (với mã được lấy từ RestSharp) trước khi chuyển nó vào, ví dụ:
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]);
Nhưng điều này không có tác dụng (tôi vẫn nhận được lỗi xác thực).
Điều gì thực sự là vấn đề ở đây và tôi nên làm gì để mã hóa chính xác trạng thái? Hay đây là lỗi RestSharp?
Bạn có tìm thấy giải pháp hoặc làm việc xung quanh không? Tôi đang cố gắng giải quyết vấn đề này ngay bây giờ. –
@Michael_B Không, xin lỗi: Tôi bắt đầu xem xét nó, nhưng đã không nhận được rất xa trước khi các ưu tiên khác có trong cách. –
Tôi đã kết thúc bằng cách sử dụng Linq2Twitter để cập nhật trạng thái. Nó hoạt động với v1.1 của API Twitter. Tôi không bao giờ tìm thấy một cách nào đó xung quanh các vấn đề OAuth của RestSharp. –