dart 无法访问带有Flutter的HTTP响应中的Cookie

x8diyxa7  于 2023-04-03  发布在  Flutter
关注(0)|答案(4)|浏览(722)

我正在开发Flutter应用程序,该应用程序将使用基于Express的REST API。在实现基于Cookie的会话时,我想通过基本的auth请求从应用程序中检索Cookie,但不知何故,我无法检索Cookie作为响应。当我从Postman发出相同的请求时,没有问题,Cookie会自动设置。
我使用HTTP包进行请求,代码非常简单,如下所示。

void login(String username, String password) async {
var url = 'http://$username:$password@111.222.333.444:3333/auth';
var response = await http.get(url);
print('Response header: ${response.headers}');
print('Response status: ${response.statusCode}');
print('Response body: ${response.body}');
}

响应的头部或主体中没有cookie。

2ledvvac

2ledvvac1#

如果你想从flutter中的HTTP响应中获取cookie值

String rawCookie = response.headers['set-cookie']!;
int index = rawCookie.indexOf(';');
String refreshToken = (index == -1) ? rawCookie : rawCookie.substring(0, index);
int idx = refreshToken.indexOf("=");
print(refreshToken.substring(idx+1).trim());
dy1byipe

dy1byipe2#

Cookie总是带有响应头。如果Cookie是由后端设置的。
如果你想检查cookie是否有响应,那么就像这样打印。

print(response.headers.keys.toList());
print(response.headers.values.toList());
print(response.headers['set-cookie']);

如果您希望cookie单独作为cookie类型。您可以使用此sweet_cookie_jar包。
这样就能搞定琦琦

Response response=await http.get(Uri.parse('https://catfact.ninja/fact'));
SweetCookieJar sweetCookieJar=SweetCookieJar.from(response: response);
Cookie cookie=sweetCookieJar.find(name: 'XSRF-TOKEN');
print(cookie.name);
print(cookie.value);
print(cookie.expires);

PS:我也有同样的疑问,为什么没有getter可用于cookie,如果我找到答案,我会更新这个答案。

kmbjn2e3

kmbjn2e33#

你必须在header中调用'set-cookie':

var cookies = response.headers['set-cookie'];
7vux5j2d

7vux5j2d4#

http package get和post操作正在发送没有cookie的请求,因此您应该像这样手动放置cookie:

Response response = await get(url, headers: {'cookie': 'session_id=ufe1nfq69mdi67pnql6n1cs3cv; path=/; HttpOnly='});

但是有一个简单的方法可以做到这一点,而无需通过requests package手动放置cookie。

import 'package:requests/requests.dart';
// ...

// For example post some login request
  var url = "http://yourApilink";
  var body = Map<String, dynamic>();
  body["username"] = username;
  body["password"] = password;
  var request = await Requests.post(url, body: body);
  request.raiseForStatus();
  if(request.statusCode==200) {
    //Successful
    var statusJson = json.decode(utf8.decode(request.bytes()));
//....

// Example for get some other actions
  var url = "http://yourApilink";
  var request = await Requests.get(url);
  request.raiseForStatus();
  print(request.json()['userid']);
  if(request.statusCode==200) {
    //Successful
    var statusJson = json.decode(utf8.decode(request.bytes()));
//....

相关问题