如何从标题中获取 Flutter Web 中的 cookie?

Dan*_*zen 2 cookies flutter flutter-web

Flutter Web 应用程序发送一个 HTTP REST API POST 请求,并在 Set-Cookie 标头中获取一个 JSON 响应和一个 cookie,如下所示。

(Flutter (Channel beta, 1.22.0, on Microsoft Windows)

设置 Cookie 标头

提取 cookie 时,响应似乎没有找到标头值。调用和提取代码为:

var response = await http.post(url, headers: {"Content-Type": "application/json"}, body: jsonEncode(data));

if (response.statusCode == 200) {
  var cookie = response.headers['set-cookie'];
  print('cookie: $cookie');
}
Run Code Online (Sandbox Code Playgroud)

控制台结果是:

cookie: null
Run Code Online (Sandbox Code Playgroud)

服务器端在 Docker 容器中的 ASPNet.Core 3.1 上运行,但是这应该不是问题,因为 cookie 位于标头中。那么,如何在 Flutter Web 中提取它呢?

实际上,我的最终目标是将 cookie 与所有其他请求一起发回。但它似乎不会在浏览器中自动发生。因此,如果有人可以指出处理这种情况的正确方法,这也是一个很好的解决方案。

任何帮助表示赞赏。谢谢。

Pio*_*emp 9

这个问题是一个月前提出的,但我的回答可能对其他人有帮助。Flutter Web 中的 Cookie 由浏览器管理 - 它们会自动添加到请求(到 Cookie 标头),如果 cookie 之前由 Set-Cookie 设置 - 更准确地说,它在您发布 build时正常工作。就我而言,它在开发构建期间不起作用。我的解决方案:

在服务器集标头上:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:61656
Run Code Online (Sandbox Code Playgroud)

// 端口号可能不同

在颤振中:班级成员:

final http.Client _client = http.Client();
Run Code Online (Sandbox Code Playgroud)

// 例子

Future<String> getTestString() async {
    if (_client is BrowserClient)
      (_client as BrowserClient).withCredentials = true;
    await _client.get('https://localhost/api/login');
    await _client.get('https://localhost/api/login');
    return 'blah';
  }
Run Code Online (Sandbox Code Playgroud)

如果 dart:io 可用,则 http.Client() 创建一个 IOClient,如果 dart:html 可用则创建一个 BrowserClient - 在 Flutter Web 中 dart:html 可用。将 withCredentials 设置为 true 可使 cookie 工作。

运行您的应用程序:

flutter run -d chrome --web-port=61656
Run Code Online (Sandbox Code Playgroud)

// 与服务器上相同的端口号

请记住,在 Flutter Web 中,网络请求是通过浏览器 XMLHttpRequest 发出的。

  • `BrowserClient` _未定义_,哪个包提供了它? (2认同)