Неверный запрос 400, запрашивающий ASP.Net Core 3.0 от Flutter - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь подключить Flttter HttpClient для получения данных с моего локального сервера, который работает на ASP.Net Core 3.0. Проблема в том, что я получаю ошибку 400 (неверный запрос) при каждой попытке.

Вот код флаттера:

    String token = await SharedPreferencesService.getStringFromSF('idToken');
    var client = new HttpClient();
    client.badCertificateCallback =
        (X509Certificate cert, String host, int port) => true;

    HttpClientRequest request =
        await client.getUrl(Uri.parse('https://10.0.2.2:44383/weatherforcast'));
    request.headers.add('idToken', token);

    HttpClientResponse response = await request.close();
    String reply = await response.transform(utf8.decoder).join();

Конечная точка ядра 3.0 asp.net:

    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        [HttpGet]
        public User Get()
        {
            return new User { UserId = 1332, Username = "Michal" };
        }
    }

Ошибка

<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>

Я могу подтвердить, что я получаю данные как в браузере, так и на почтальоне. Спасибо за помощь.

1 Ответ

1 голос
/ 14 октября 2019

Хорошо, я исправил проблему путем отладки, шаг за шагом.

Кажется, что Android не нравятся самозаверяющие сертификаты, поэтому я не мог настроить его на использование HTTPS. в конце.

Что я сделал, так это то, что я заставил его работать с единственным HTTP, и это шаги:

  1. Измените IIS на локальную среду выполнения (по умолчанию имяпроект)
  2. Удалить app.UseHttpsRedirection(); в способе настройки сервера

Теперь мы включили HTTP-запросы к нашему серверу. Далее следует запустить сервер через нашу локальную среду выполнения (которую мы можем изменить с помощью кнопки Отладка в VS).

Теперь мы должны иметь возможность доступа к API в нашем браузере в эмуляторе Android с помощьюhttp запрос например http://localhost:5000/weatherforcast. Помните, что ASP.NET Core 3.0 по умолчанию обслуживает HTTPS на порту 5001 и HTTP на 5000.

Затем Android использует псевдоним для IP-адреса локальной машины, на которой работает сервер, поэтому вместо записи localhost:<port> мы должны написать 10.0.2.2:<port>

Наконец, я упростил вызов API в клиенте, чтобы он выглядел так:

static Future<Profile> getUserProfile() async {
    String url = 'http://10.0.2.2:5000/weatherforecast';
    final reply = await http.get('$url');
    var responseJson = json.decode(reply.body);
    return Profile.fromJson(responseJson);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...