c# - bearer - token web api
RestSharp y Twitter API 1.1: ¿Cómo puedo URLEncode el texto de actualización de estado? (1)
¿Has intentado utilizar la clase HttpUtility integrada en .NET Framework? Puede encontrarlo en el espacio de nombres System.Web.
string urlEncodedText = HttpUtility.UrlEncode("Your text goes here");
Este es definitivamente un problema de RestSharp ... Jugué con él por un tiempo y el problema es que no hay forma de deshabilitar la codificación porcentual estándar ...
void Main()
{
var ProtectedChars = "0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A".Replace(" 0x", "%").Split('','');
var client = new RestClient("https://api.twitter.com");
client.Authenticator = OAuth1Authenticator.ForProtectedResource(
"_consumerKey", "_consumerSecret", "_accessToken", "_accessTokenSecret"
);
var status = "Dogs, Cats & Mice";
string newStatus = string.Empty;
foreach (char c in status)
{
var charBytes = Encoding.UTF8.GetBytes(c.ToString());
var tempText = string.Empty;
for (int i = 0; i < charBytes.Count(); i++)
{
byte b = charBytes[i];
string hex = "%" + b.ToString("X2");
tempText += hex;
}
if (ProtectedChars.Any(x => x == tempText))
{
newStatus += c;
}
else
{
newStatus += string.Format("{0:X2}", tempText);
}
}
var request = new RestRequest("/1.1/statuses/update.json", Method.POST);
request.AddParameter(new Parameter{ Name = "status", Type = ParameterType.GetOrPost, Value = newStatus } );
var response = client.Execute(request);
}
En Fiddler he estado monitoreando las solicitudes que van a Twitter ... y esto es lo que encontré ...
POST https://api.twitter.com/1.1/statuses/update.json HTTP/1.1
Authorization: /* auth data */
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml
User-Agent: RestSharp/104.4.0.0
Content-Type: application/x-www-form-urlencoded
Host: api.twitter.com
Content-Length: 44
Accept-Encoding: gzip, deflate
status=Dogs%252C%2520Cats%2520%2526%2520Mice
El problema con la Solicitud de Http es el cuerpo de nuestra solicitud ... si no se hubiera tocado el valor que yo había proporcionado ... entonces Twitter habría reconocido el mensaje y actualizado nuestro estado para nosotros ...
status=Dogs%252C%2520Cats%2520%2526%2520Mice <--- Altered by RestSharp
status=Dogs%2C%20Cats%20%26%20Mice <--- What I initially sent
Intento publicar un estado de Twitter desde mi aplicación web, utilizando RestSharp . El siguiente código funciona perfectamente:
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);
Sin embargo, este código falla con un error de autenticación si incluyo alguno de los siguientes caracteres en el texto de estado:! ! * '' ( )
A través de muchos foros de pesca, deduje que esto tiene algo que ver con la codificación de firma OAuth que no coincide con la codificación de los parámetros POST. Encontré esta pregunta en SO , pero buscar en los problemas de RestSharp en GitHub no revela nada útil.
Puedo ver algún código en la fuente RestSharp ( UrlEncodeRelaxed
) que parece estar codificando manualmente ese conjunto particular de caracteres para cumplir con las especificaciones de codificación OAuth, así que he intentado codificar manualmente esos caracteres en mi estado de la misma manera (con código tomado de RestSharp) antes de pasarlo, por ejemplo:
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]);
Pero esto tampoco funciona (todavía obtengo el error de autenticación).
¿Cuál es el problema aquí y qué debo hacer para codificar correctamente el estado? ¿O es esto un error RestSharp?