【问题标题】:401 on POST requests, how to set up properly http service?POST 请求时出现 401,如何正确设置 http 服务?
【发布时间】:2022-01-24 19:26:57
【问题描述】:

我在成功登录后尝试获取数据。我在后端有基于 cookie 的身份验证。我检查了登录响应,发现 cookie 存在于标题中。我不确定为什么我的请求不与 cookie 一起使用。

我在控制台中不断收到此代码,未授权代码。 I/flutter (21293): 401

class Session {
  Map<String, String> headers = {};

  Future<Map> get(String endpoint) async {
    http.Response response = await http.get(Uri.parse("$baseUrl$endpoint"), headers: headers);
    print(response.statusCode);
    updateCookie(response);
    return jsonDecode(response.body);
  }

  Future<http.Response> post(dynamic data, String endpoint) async {
    http.Response response = await http.post(Uri.parse("$baseUrl$endpoint"), body: json.decode(data), headers: headers);
    updateCookie(response);
    return response;
  }

  void updateCookie(http.Response response) {
    String? rawCookie = response.headers['set-cookie'];
    if (rawCookie != null) {
      int index = rawCookie.indexOf(';');
      headers['cookie'] =
      (index == -1) ? rawCookie : rawCookie.substring(0, index);
    }
  }
}

也尝试打印 rawCookie

I/flutter (21293): _api_key=SFMyNTY.g3QAAAABbQAAAAhpZGVudGl0eXQAAAAHZAAKX19zdHJ1Y3RfX2QAF0VsaXhpci5HYXRld2F5LklkZW50aXR5ZAAGYWN0aXZlZAAEdHJ1ZWQACWF2YXRhcl9pZG0AAAAkNTY4NWMwNTMtYThhMS00MDA5LWJhN2UtZmJkNTkyMjBhM2U1ZAAHY291bnRyeXQAAAAGZAAEZmxhZ20AAAAI8J-HtfCfh7FkAAppc29fbmFtZV8ybQAAAAJwbGQACmlzb19uYW1lXzNtAAAAA3BvbGQABG5hbWVtAAAABlBvbGFuZGQACG51bV9jb2RlbQAAAAM2MTZkAAVwb2ludHQAAAAEZAAKX19zdHJ1Y3RfX2QAEEVsaXhpci5HZW8uUG9pbnRkAAtjb29yZGluYXRlc2gCYRRhNGQACnByb3BlcnRpZXN0AAAAAGQABHNyaWRiAAAQ5mQAC2Rlc2NyaXB0aW9ubQAAAAF4ZAACaWRtAAAAJGM2ZTljY2Q0LTM4MmItNDEzZi04ODYyLTc2ZjM5ZTYxOGFiNGQABG5pY2ttAAAACHRlc3Rzc3Nz.80iQK3sUwPPVj1pkaZsKgMxQ4Lt8aW8-ndYbPSucGag; path=/; HttpOnly
I/flutter (21293): 200

那我用它

class Items{
  Future<Map> fetchItems() async {
    final response = await Session().get("/user/items");
    return response;
  }
}

【问题讨论】:

标签: flutter dart


【解决方案1】:

我遇到了同样的问题。我通过使用 dio 和 cookiejar 而不是 HTTP 解决了它。

在您的pubspec.yaml 中添加这些依赖项:

dependencies:
  dio: ^4.0.4
  dio_cookie_manager: ^2.0.0
  cookie_jar: ^3.0.1

这里是一个使用 dio 的例子:

var dio =  Dio(BaseOptions(
      connectTimeout: 10000,  // in ms
      receiveTimeout: 10000,
      sendTimeout: 10000,
      responseType: ResponseType.plain,
      followRedirects: false,
      validateStatus: (status) { return true; }
  ));   // some dio configurations

dio.interceptors.add(CookieManager(CookieJar()));

Response response = await dio.post(
          "http://example.com/login",
          data: FormData.fromMap(
             {
                'username': 'myUser',
                'password': 'myPassword',
             }
          ));  // cookies are automatically saved


Response nextResponse = await dio.post("http://example.com/user/items");

【讨论】:

  • 我需要为每个请求编写 dio.interceptors.add.. 吗?我仍然通过您的示例获得 401:/
  • 要保留cookie,您必须使用相同的Dio(BaseOptions())。您可能希望将其保存在全局变量或其他东西中。对于每个 Dio(BaseOptions()) 实例化,您只需调用一次 dio.interceptors.add。如果您想要持久性 cookie(存储在非易失性存储而不是 RAM 中),您可能还需要考虑 PersistCookieJar
  • @squnk 你的问题如何?已经解决了吗?我刚刚意识到,当你在 chrome 中运行你的颤振时,dio 和 cookie jar 不起作用,但如果你在 android 模拟器中运行它会运行得很好
  • 它已经解决了,问题是我正在创建新的 Dio 实例而不是只使用一个。
  • 我明白了。我很高兴听到这个消息!
猜你喜欢
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 2016-07-03
  • 2014-11-09
  • 2017-03-10
  • 1970-01-01
相关资源
最近更新 更多