es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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 y data. La propiedad success debería ser un booleano que indique si la solicitud fue exitosa o no, y la propiedad data debería contener el resultado real de la solicitud, en este caso, un objeto Token.

    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 en application/json, pero la línea request.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 argumento Method.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 sea false y requestResponse.Data.Token siempre sea null, se debe modificar el código de deserialización para incluir la propiedad de nivel superior success en la respuesta. Por ejemplo:

    public class AuthorizationRequestResponse
    {
        [JsonProperty(PropertyName = "success")]
        public bool WasSuccessful { get; set; }
    
        [JsonProperty(PropertyName = "data")]
        public Token Token { get; set; }
    }
    
    ...
    
    IRestResponse<authorizationrequestresponse> requestResponse = await _restClient.ExecuteAsync<authorizationrequestresponse>(request);
    if(requestResponse.Data.WasSuccessful)
    {
        // hacer algo con requestResponse.Data.Token
    }
    else
    {
        // manejar el error
    }
    

    Con este código, el objeto requestResponse.Data ahora debería contener las propiedades WasSuccessful y Token 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.

Comments are closed.