Получение statuscode = 400 при использовании http.get из dart / flutter по локальному IP-адресу - PullRequest
0 голосов
/ 19 октября 2019

Моя цель:

Я хочу сделать запрос на получение RestApi, который работает на устройстве в моей локальной сети, для получения данных JSON, сгенерированных устройством.

Что происходит

RestApi правильно реагирует на вызов браузера с любого другого устройства в сети. Скручивание Bash также работает, однако однако, когда я пытаюсь получить доступ к данным через http.get dart, программе не удается получить данные JSON - я получаю Statuscode 400.

Результат вызова браузера

Что я пробовал:

  • Возиться с URL, чтобы убедиться, что он написан правильно,
  • Настройка заголовков {"content": "application / json"}
  • Использование заголовков без (по умолчанию)
  • Запуск вызова API из отдельного файла дротика и из функции, встроенной в приложение флаттера. Оба результата привели к появлению Statuscode 400, хотя флаттер предоставил дополнительную информацию об ошибке: Необработанное исключение: SocketException: Ошибка ОС: нет маршрута к хосту, errno = 113. Мне кажется, я также видел errno = 111, когда пытался что-то еще.
  • Использование HttpClient более низкого уровня вместо Http

В приложении флаттера я могу достаточно легко подключиться к данным, хранящимся в firebase, через http.get, но вызов устройства в локальной сети приводит ксценарий, описанный выше.

автономный файл дротика

import 'package:dart_http/dart_http.dart' as dart_http;
import 'package:http/http.dart' as http;
import 'dart:io';
import 'dart:convert';

main(List<String> arguments) async {

  var url = 'http://192.168.0.5/api/device/state';

  http.Response response1 =
      await http.get(url, headers: {"content": "application/json"});
  print('Response status: ${response1.statusCode}');
  print('Response body: ${response1.body}');
  print('Response body: ${response1.headers}');
  print('Response body: ${response1.reasonPhrase}');
  print('Response body: ${response1.request}');

  HttpClient()
      .getUrl(Uri.parse(
          'http://192.168.0.5/api/device/state/')) // produces a request object
      .then((request) => request.close()) // sends the request
      .then((response) {
    print(response);
    response.transform(Utf8Decoder()).listen(print);
  }); // transforms and prints the response
}

встроенный вызов в проект флаттера

 Future<Map<String, String>> getAirSensorStatus() async {
    print("Getting Air Sensor");
http.Response response =
        await http.get('http://192.168.0.5/api/device/state');
        print(response);
        print("Status code  " + "${response.statusCode}");

    try {
      if (response.statusCode != 200 && response.statusCode != 201) {
        print("Something went wrong. Status not 200 and not 201 for AirSensor");
        return null;
      }
      final responseData = json.decode(response.body);

      return responseData;
    } catch (error) {
      print(error);
      return null;
    }
  }

Я ожидаю получить код состояния 200 и JSONданные в ответе. Вместо этого создается только объект ответа и соединение не устанавливается.

Не могли бы вы помочь мне выяснить, почему это так?

Ссылка на документацию API, к которой я пытаюсь получить доступ:

https://technical.blebox.eu/

...