Cuando se utiliza el método ExecuteAsync() de RestClient, ¿qué debo hacer para que IRestResponse.Data se popule correctamente?
Tengo el siguiente código:
restClient.BaseUrl = new Uri(personioConfig.BaseUrl, "/v1/auth");
_restClient.Timeout = -1;
_restClient.AddHandler("application/json", () => new JsonDeserializer());
IRestRequest request = new RestRequest(Method.POST)
.AddQueryParameter("client_id", _personioConfig.ClientId)
.AddQueryParameter("client_secret", _personioConfig.ClientSecret)
.AddHeader("Accept", "application/json");
request.OnBeforeDeserialization = response =>
response.ContentType = "application/json";
IRestResponse<authorizationrequestresponse> requestResponse = await _restClient.ExecuteAsync<authorizationrequestresponse>(request);
donde AuthorizationRequestResponse
se ve así:
public class AuthorizationRequestResponse
{
[JsonProperty(PropertyName = "success")]
public bool WasSuccessful { get; set; }
[JsonProperty(PropertyName = "data")]
public Token Token { get; set; }
}
Cuando ejecuto esto y la solicitud es exitosa, espero que requestResponse.Data.WasSuccessful
sea true
y que requestResponse.Data.Token
tenga el contenido correspondiente al valor serializado en requestResponse.Content
.
O, en otras palabras, esperaría:
AuthorizationRequestResponse? authorizationResponse = JsonConvert.DeserializeObject<authorizationrequestresponse>(requestResponse.Content);
Assert.Equal(authorizationResponse, requestResponse.Data);
Sin embargo, en la realidad, requestResponse.Data.WasSuccessful
siempre es false
y requestResponse.Data.Token
siempre es null
, sin importar el valor de requestResponse.Content
, que puedo ver en el depurador de Visual Studio (por ejemplo) se vería como:
"{success:true,data:{token:\"eyJ0eXAiOiJKV1QiLCJhGciOi\"}}"
(El valor del token se ha truncado por concisión y seguridad).
¿Estoy perdiendo o entendiendo algo mal? ¿Qué más necesito hacer para que requestResponse.Data
se rellene como se espera, o estoy completamente equivocado al esperar esto? En tal caso, ¿por qué existe?
davy.ai
Según el código proporcionado y la clase
AuthorizationRequestResponse
, parece que se espera que la respuesta JSON del servidor tenga un objeto de nivel superior con dos propiedades:success
ydata
. La propiedadsuccess
debería ser un booleano que indique si la solicitud fue exitosa o no, y la propiedaddata
debería contener el resultado real de la solicitud, en este caso, un objetoToken
.Sin embargo, el código no está deserializando correctamente la respuesta JSON. En el código proporcionado, la línea
request.OnBeforeDeserialization = response => response.ContentType = "application/json";
establece el tipo de contenido de la respuesta enapplication/json
, pero la línearequest.AddHeader("Accept", "application/json");
solo especifica el tipo esperado para la solicitud. Esto podría provocar problemas con la deserialización.Además, el objeto
RestRequest
se está construyendo con un argumentoMethod.POST
, pero los parámetros de la solicitud se están agregando como parámetros de consulta, lo cual típicamente se utilizaría para una solicitud GET. Es posible que el servidor no esté interpretando correctamente la solicitud POST, lo cual podría causar problemas con la respuesta.Para solucionar el problema de que
requestResponse.Data.WasSuccessful
siempre seafalse
yrequestResponse.Data.Token
siempre seanull
, se debe modificar el código de deserialización para incluir la propiedad de nivel superiorsuccess
en la respuesta. Por ejemplo:Con este código, el objeto
requestResponse.Data
ahora debería contener las propiedadesWasSuccessful
yToken
deserializadas correctamente.En general, es difícil decir con certeza cuál es la causa del problema sin más información sobre la respuesta del servidor y el error específico que se está encontrando. Sin embargo, los cambios mencionados anteriormente deberían ayudar a asegurar que la deserialización se realice correctamente y con el tipo de contenido correcto.