WebAPI и winforms
Есть сайт на 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<APILogin>(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("Введите пароль пользователя:");
string userPassword = Console.ReadLine() ?? string.Empty;
APILogin model = new()
{
Login = userName ?? "user",
Password = userPassword,
DeviceId = "1231"
};
string value = JsonConvert.SerializeObject(model);
// определяем данные запроса
using HttpRequestMessage request = new(HttpMethod.Get, $"https://localhost:44304/api/account/");
StringContent requestContent = new(value, Encoding.UTF8, "application/json");
request.Content = requestContent;
// получаем ответ
using HttpResponseMessage response = await client.SendAsync(request);
// просматриваем данные ответа
// статус
Console.WriteLine($"Status: {response.StatusCode}\n");
//заголовки
Console.WriteLine("Headers");
foreach (var header in response.Headers)
{
Console.Write($"{header.Key}:");
foreach (var headerValue in header.Value)
{
Console.WriteLine(headerValue);
}
}
// содержимое ответа
Console.WriteLine("\nContent");
string content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
Console.WriteLine(content);
}
Проблема: выводит, что страница не найдена. Вопрос: всё ли корректно или что-то не так? Подскажите, где можно копать инфу КАК ОРГАНИЗОВАТЬ это дело.
Ответы (1 шт):
Автор решения: GoodBoyAlex
→ Ссылка
Получилось сделать следующим способом.
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 = "https://example.com/api";
/// <summary>
/// Конструктор
/// </summary>
static APIActions () => Client = new();
public static async Task<APILoginResult> LoginAsync (string userName, string userPassword)
{
//Создаю модель входа
APILogin model = new()
{
Login = userName,
Password = userPassword
};
//Получаю адрес url
string url = $"{BaseUrl}/account?value={JsonConvert.SerializeObject(model)}";
//Задаём данные запроса
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<APILoginResult>(content,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
})
?? new();
}
}
Консольное приложение
static async Task LoginAsync ()
{
Console.WriteLine("Введите имя пользователя:");
string? userName = Console.ReadLine() ?? string.Empty;
Console.WriteLine("Введите пароль пользователя:");
string userPassword = Console.ReadLine() ?? string.Empty;
APILoginResult result = await APIActions.LoginAsync(userName, userPassword);
if (!result.IsSuccess)
{
Console.WriteLine(result.ErrorMessage);
return;
}
Console.WriteLine("Получена информация о пользователе:");
Console.WriteLine(JsonConvert.SerializeObject(result));
}
В целом, теперь работает.