Как клиент Web API может прочитать сложный тип из ответа? - PullRequest
0 голосов
/ 13 мая 2018

Я создал действие POST, которое должно возвращать сложный тип, как показано ниже, как часть HTTPContent:

    [HttpPost]
    [Route("users/verifyLoginCredentials")]
    public IHttpActionResult VerifyLoginCredentials([FromBody]Dictionary<string,string> loginCredentials) // Purely here for testing purouses
    {
        Models.User user = new Models.User();
        string username = (loginCredentials.ContainsKey("userLogin"))? loginCredentials["userLogin"]: "";
        string password = (loginCredentials.ContainsKey("password"))? loginCredentials["password"] : "";

        var verificationResult = Models.User.VerifyLoginCredentials(username, password, out user);
        HttpContent responseContent = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(user));

        if (verificationResult)
        {   
            return Ok(responseContent);
        }

        return BadRequest("Login Failed");
    }

И затем в моем клиентском приложении я хочу прочитать тип Complex, который был сериализован в объект Json, поэтому очевидным было бы десериализовать его, но где он (пользовательский объект)?

    public static async Task<bool> VerifyCredentials(string userLogin, string password)
    {
        var value = new Dictionary<string, string>
        {
           { "userLogin", userLogin },
           { "password", password }
        };

        var test = Newtonsoft.Json.JsonConvert.SerializeObject(value);
        var content = new StringContent(test, Encoding.UTF8, "application/json");

        var result = await WebApiHelper.Client.PostAsync("users/verifyLoginCredentials", content);
        string resultContent = await result.Content.ReadAsStringAsync();

        var user = (User)Newtonsoft.Json.JsonConvert.DeserializeObject(resultContent);

        if (result.IsSuccessStatusCode)
        {
            return true;
        }

        return false;
    }

1 Ответ

0 голосов
/ 13 мая 2018

На стороне клиента

Вместо того, чтобы сделать это в два этапа:

var result = await WebApiHelper.Client.PostAsync("users/verifyLoginCredentials", content);
/*1: read as string*/string resultContent = await result.Content.ReadAsStringAsync();

/*2: deserialize*/ var user = (User)JsonConvert.DeserializeObject(resultContent);

Вы можете сделать это за один шаг:

var result = await WebApiHelper.Client.PostAsync("users/verifyLoginCredentials", content);
/*1: read as User*/User resultContent = await result.Content.ReadAsAsync<User>();

Это, однако:

if (result.IsSuccessStatusCode)
{
    return true;
}

Необходимо проверить перед тем, как попытаться десериализовать, в противном случае вы бы попытались десериализовать "Ошибка входа в систему" как объект пользователя - что, конечно, недопустимо.Итак:

public static async Task<bool> VerifyCredentials(string userLogin, string password)
{
    var value = new Dictionary<string, string>
    {
       { "userLogin", userLogin },
       { "password", password }
    };

    var test = Newtonsoft.Json.JsonConvert.SerializeObject(value);
    var content = new StringContent(test, Encoding.UTF8, "application/json");

    var result = await WebApiHelper.Client.PostAsync("users/verifyLoginCredentials", content);

    if (result.IsSuccessStatusCode)
    {
        return true;
    }

    User resultContent = await result.Content.ReadAsAsync<User>();

    return false;
}

Я не уверен, выиграете ли вы что-нибудь в результате этой десериализации, хотя


На стороне сервера

Этот код здесь:

var verificationResult = Models.User.VerifyLoginCredentials(username, password, out user);
HttpContent responseContent = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(user));

if (verificationResult)
{   
    return Ok(responseContent);
}

Слишком сложный.Web API уже JSON-сериализует модель по умолчанию, вам не нужно делать все это.Вместо этого:

var verificationResult = Models.User.VerifyLoginCredentials(username, password, out user);

if (verificationResult)
{   
    return Ok(user);
}

Кроме того, вы должны использовать надлежащий объект передачи данных (DTO) вместо получения словаря, который вы не можете проверять на платформе Framework, но это еще одна проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...