0

Есть сайт на ASP.Net Core 7. В нём есть Api-контроллер для получения информации о пользователе

[HttpGet("{value}"), ItemCanBeNull]
public async Task<ActionResult<string>> Get ([FromBody, NotNull] string value)
{
    //Создаю результат
    APILoginResult result = new();
APILogin model = JsonConvert.DeserializeObject&lt;APILogin&gt;(value);

//Здесь получаю пользователя

return JsonConvert.SerializeObject(result);

}

и есть консольное приложение (пока для теста, а потом в WinForms) с методом получения данных:

//Http клиент
HttpClient client = new();
client.BaseAddress = new Uri("https://localhost:44304/api/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
await LoginAsync(client);

и вот собственно сама функция:

static async Task LoginAsync (HttpClient client)
{
    Console.WriteLine("Введите имя пользователя:");
    string? userName = Console.ReadLine();
Console.WriteLine(&quot;Введите пароль пользователя:&quot;);
string userPassword = Console.ReadLine() ?? string.Empty;

APILogin model = new()
{
    Login = userName ?? &quot;user&quot;,
    Password = userPassword,
    DeviceId = &quot;1231&quot;
};

string value = JsonConvert.SerializeObject(model);

// определяем данные запроса
using HttpRequestMessage request = new(HttpMethod.Get, $&quot;https://localhost:44304/api/account/&quot;);

StringContent requestContent = new(value, Encoding.UTF8, &quot;application/json&quot;);

request.Content = requestContent;

// получаем ответ
using HttpResponseMessage response = await client.SendAsync(request);

// просматриваем данные ответа
// статус
Console.WriteLine($&quot;Status: {response.StatusCode}\n&quot;);
//заголовки
Console.WriteLine(&quot;Headers&quot;);
foreach (var header in response.Headers)
{
    Console.Write($&quot;{header.Key}:&quot;);
    foreach (var headerValue in header.Value)
    {
        Console.WriteLine(headerValue);
    }
}
// содержимое ответа
Console.WriteLine(&quot;\nContent&quot;);
string content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
Console.WriteLine(content);

}

Проблема: выводит, что страница не найдена. Вопрос: всё ли корректно или что-то не так? Подскажите, где можно копать инфу КАК ОРГАНИЗОВАТЬ это дело.

  • Единственное чего добился, это получения ошибки Unhandled exception. Newtonsoft.Json.JsonSerializationException: Error converting value "{"IsSuccess":false,"ErrorMessage":"Попытка входа в систему пользователя неуспешна! Проверьте имя пользователя и пароль!","User":null}" to type 'APILoginResult'. Path '', line 1, position 143. – GoodBoyAlex Jan 21 '23 at 18:35
  • Как ни странно, помогло удаление кода:Client.DefaultRequestHeaders.Accept.Clear(); //Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); – GoodBoyAlex Jan 21 '23 at 18:38

1 Answers1

0

Получилось сделать следующим способом.

API Controller

[HttpGet, ItemCanBeNull]
public async Task<ActionResult<string>> Get ([CanBeNull] string value)
{
    //Создаю результат
    APILoginResult result = new() {IsSuccess = false};
    if (value == null)
    {
        //Вывожу ошибку
        result.ErrorMessage = "Нет данных для входа пользователя!";
        //Вывожу результат
        return JsonConvert.SerializeObject(result);
    }
    //Получаю модель
    APILogin model = JsonConvert.DeserializeObject<APILogin>(value);
    //... ТУТ ПОЛУЧАЮ ПОЛЬЗОВАТЕЛЕЙ
    //Возвращаю результат
    result.IsSuccess = true;
    return JsonConvert.SerializeObject(result);
}

Статический класс

public static class APIActions
{
    //Http клиент
    private static readonly HttpClient Client;
//Http клиент
private const string BaseUrl = &quot;https://example.com/api&quot;;

/// &lt;summary&gt;
/// Конструктор
/// &lt;/summary&gt;
static APIActions () =&gt; Client = new();

public static async Task&lt;APILoginResult&gt; LoginAsync (string userName, string userPassword)
{
    //Создаю модель входа
    APILogin model = new()
    {
        Login = userName,
        Password = userPassword
    };

    //Получаю адрес url
    string url = $&quot;{BaseUrl}/account?value={JsonConvert.SerializeObject(model)}&quot;;

    //Задаём данные запроса
    using HttpRequestMessage request = new(HttpMethod.Get, url);

    //Посылаем запрос и записываем ответ
    using HttpResponseMessage response = await Client.SendAsync(request);

    //Получаю содержимое
    await using Stream responseStream = await response.Content.ReadAsStreamAsync();
    string content = await new StreamReader(responseStream).ReadToEndAsync();
    content = content.Trim();

    //Вывожу результат
    return
        JsonConvert.DeserializeObject&lt;APILoginResult&gt;(content,
            new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore

            })
        ?? new();
}

}

Консольное приложение

static async Task LoginAsync ()
{
    Console.WriteLine("Введите имя пользователя:");
    string? userName = Console.ReadLine() ?? string.Empty;
Console.WriteLine(&quot;Введите пароль пользователя:&quot;);
string userPassword = Console.ReadLine() ?? string.Empty;

APILoginResult result = await APIActions.LoginAsync(userName, userPassword);

if (!result.IsSuccess)
{
    Console.WriteLine(result.ErrorMessage);
    return;
}

Console.WriteLine(&quot;Получена информация о пользователе:&quot;);
Console.WriteLine(JsonConvert.SerializeObject(result));

}

В целом, теперь работает.