如何使用 flutter web 正确地获得 cookie 的响应?

How do you properly get a response with cookies using flutter web?

提问人:Andy32 提问时间:11/16/2023 最后编辑:Andy32 更新时间:11/16/2023 访问量:35

问:

我已经习惯了从 Flutter Mobile 切换到 Web。 从未在移动设备上与 cookie 互动过,现在这样做让我感到不安。

每当我尝试测试来自随机网站的响应时,看看我是否可以获得他们的 cookie,我都会从响应中获得除 cookie(又名“set-cookie”值)之外的所有内容。

这是我使用的 fetch 的一个片段: 函数

但我只得到以下响应: 调试器中的响应

我正在使用我发现的一个随机网站来测试它(“https://catfact.ninja/fact”),我不确定这是否重要。

如果我做错了什么,是否有任何指南或东西可以设置 android studio 以获取 cookie 或其他东西?

已经尝试使用 dart:html、dart:http、package:http 和 dart:io 包。

编辑:

这是主屏幕:

import 'package:flutter/material.dart';

import '../../data/repository/cookie_repository.dart';
import '../../domain/repository/interface/i_cookie_repository.dart';

class MainScreen extends StatefulWidget {
  const MainScreen({super.key});

  @override
  State<StatefulWidget> createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  final ICookieRepository cookieRepository = CookieRepository();

  @override
  void initState() {
    super.initState();
  }

  Future<List<String>> getUiData() async {
    final List<String> cookies = await cookieRepository.getCookies();
    return cookies;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black54,
      body: SafeArea(
        child: FutureBuilder<List<String>>(
          future: getUiData(),
          builder: (
            BuildContext context,
            AsyncSnapshot<List<String>> snapshot,
          ) {
            //debugPrint("MAINSCREEN 1st SNAPSHOT:  $snapshot");
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const CircularProgressIndicator();
            } else if (snapshot.hasError) {
              //debugPrint("MAINSCREEN HAS ERROR:  $snapshot");
              return const Text("HAS ERROR");
            } else if (snapshot.hasData) {
              //debugPrint("MAINSCREEN HAS DATA:  $snapshot");
              return ListView.builder(
                itemCount: snapshot.data?.length,
                itemBuilder: (
                  BuildContext context,
                  int index,
                ) {
                  final payload = snapshot.data![index];
                  return Card(
                    child: Text(payload),
                  );
                },
              );
            } else if (!snapshot.hasData) {
              return const Text("IS EMPTY");
            } else {
              return const Text("OTHER ERROR");
            }
          },
        ),
      ),
    );
  }
}

这是我得到响应的数据存储库:

import 'package:flutter/foundation.dart';
import 'package:http/http.dart';

import '../../domain/repository/interface/i_cookie_repository.dart';

class CookieRepository extends ICookieRepository {
  List<String> parsedCookieList = [];
  final String cookieUrl = "https://catfact.ninja/fact";

  @override
  Future<List<String>> getCookies() async {
    if (parsedCookieList.isEmpty) {
      fetchDataFromCookieOld();
      final cookie = await fetchDataFromCookie() ?? "";
      parsedCookieList = [cookie] ?? [];
    }
    return parsedCookieList;
  }

  Future<void> fetchDataFromCookieOld() async {
    final response = await Client().get(
      Uri.parse('https://catfact.ninja/fact'),
    );
    response.headers.forEach((key, value) => debugPrint('$key: $value'));
  }

考虑到代码没有被清理,所以它看起来很可怕。

颤振 Cookie

评论

0赞 Richard Heap 11/16/2023
默认情况下,标头被 XMLHttpRequest 隐藏。查看 api.dart.dev/stable/1.10.1/dart-html/HttpRequest/....set-cookie
0赞 Richard Heap 11/16/2023
你会看到 cat ninja 返回 '*' 作为 Cors 原点,因此排除了 cookie。
0赞 Community 11/16/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。
0赞 Andy32 11/16/2023
明天我将添加更多代码,但感谢您的回答!
0赞 Andy32 11/16/2023
完成@RichardHeap

答: 暂无答案