Flutter http.get 在编译为 Web 或 Android 时发送 OPTIONS 而不是 GET

Flutter http.get send OPTIONS instead GET when compiled to Web or Andriod

我正在尝试从 Flutter 中的 REST 端点获取数据。但是,当它到达端点时,它显示为 OPTIONS 而不是 GET。做更多测试,当我将设备设置为 Windows(桌面)时,下面的代码确实有效,但 Chrom Web 和 Android 不起作用。

我是不是做错了什么或者是否有正确的方法来强制 GET?这是我的代码:

var url = Uri.https('mywebsite', '/api/v1/MyEndpoint');
final response = await http.get(
    url,
    headers: {
      HttpHeaders.authorizationHeader:
          'Bearer $token',
      HttpHeaders.contentTypeHeader: 'application/json'
    },
  );

查看端点的日志显示:

Request starting HTTP/1.1 OPTIONS https://mywebsite/api/v1/MyEndpoint - 0 Executing endpoint '405 HTTP Method Not Supported'

Flutter returns错误:

Error: XMLHttpRequest error.
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart 910:28                get current
packages/http/src/browser_client.dart 69:22                                                                                    <fn>
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/zone.dart 1685:54                                              runUnary
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 159:18                                        handleValue
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 766:44                                        handleValueCallback
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 795:13                                        _propagateToListeners
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 592:7                                         [_complete]
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/stream_pipe.dart 61:11                                         _cancelAndValue
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/stream.dart 1288:7                                             <fn>
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 334:14  _checkAndCall
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 339:39  dcall
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/html/dart2js/html_dart2js.dart 37301:58                              <fn>
    at Object.createErrorWithStack (http://localhost:51989/dart_sdk.js:5080:12)
    at Function._throw (http://localhost:51989/dart_sdk.js:20337:18)
    at Function.throwWithStackTrace (http://localhost:51989/dart_sdk.js:20334:18)
    at async._AsyncCallbackEntry.new.callback (http://localhost:51989/dart_sdk.js:40851:18)
    at Object._microtaskLoop (http://localhost:51989/dart_sdk.js:40708:13)
    at _startMicrotaskLoop (http://localhost:51989/dart_sdk.js:40714:13)
    at http://localhost:51989/dart_sdk.js:36191:9

奖金问题:为什么错误消息在 XMLHttpRequest 中?我要 JSON.

注意:端点确实有效,我可以从 Postman 中点击,这是成功日志的样子:

Request starting HTTP/1.1 GET https://mywebsite/api/v1/MyEndpoint - 0 
Successfully validated the token. 
//Logging of the Request

编辑:发现它在为 Windows 编译时工作正常,但在发送到 Andriod 或 Web 时不起作用。

寻找CORS(Cross-Origin资源共享),浏览器先发送OPTIONS请求URL 与当前的不同。比如你调试的时候你的浏览器URL是localhost:PORT,但是你的网站不一样。您必须修复网站上的 CORS 处理才能使此连接正常工作。 PS:使用 Postman 发送 OPTIONS 进行测试。