2

私の目標:

デバイスによって生成された JSON データを取得するために、ローカル ネットワーク内のデバイスで実行されている RestApi に対して get 要求を行いたいと考えています。

何が起こるのですか

RestApi は、ネットワーク内の他のすべてのデバイスからのブラウザー呼び出しに正しく応答します。Bash の curl も機能しますが、dart の http.get を介してデータにアクセスしようとすると、プログラムは JSON データの取得に失敗します - Statuscode 400 を取得しています。

ブラウザ呼び出し結果

私が試したこと:

  • URLをいじって、正しく書かれていることを確認し、
  • ヘッダーの設定 {"content" : "application/json"}
  • ヘッダーを使用しない (デフォルト)
  • 別の dart ファイルとフラッター アプリに埋め込まれた関数から API 呼び出しを実行します。どちらも Statuscode 400 になりましたが、flutter はさらにいくつかのバグ情報を提供しました: Unhandled Exception: SocketException: OS Error: No route to host, errno = 113. 他のことを試したときにも errno = 111 を見たことがあると思います。
  • Http の代わりに低レベルの HttpClient を使用する

flutter アプリでは、http.get を介して Firebase に保存されているデータに簡単に接続できますが、ローカル ネットワークでデバイスを呼び出すと、上記のシナリオが発生します。

スタンドアロンのダーツ ファイル

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
}

flutter プロジェクトに埋め込まれた呼び出し

 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;
    }
  }

応答で statuscode 200 と JSON データを取得することを期待しています。代わりに、応答オブジェクトのみが作成され、接続は確立されません。

それがなぜなのかを理解するのを手伝ってもらえますか?

アクセスしようとしている API のドキュメントへのリンク:

https://technical.blebox.eu/

4

1 に答える 1