Dart - 使用 Cookie 进行 GET 请求

8

我试图发起一个GET请求,但需要添加cookie。

使用curl命令可以实现:

curl -v --cookie "sessionid=asdasdasqqwd" <my_site>

但是下面的函数没有任何作用:

import 'dart:async';
import 'package:http/http.dart' as http;
import 'package:html/parser.dart' as parser;
import 'package:html/dom.dart';

...
parseHtml() async {
   http.Response response = await http.get (
     <my_site>,
     headers: {"sessionid": "asdasdasqqwd"}
   );
   Document document = parser.parse (response.body);
   print(document.text);
}

有没有办法在Dart的GET请求中放置cookie?

嘿,你能看一下这个问题吗?https://dev59.com/yXcPtIcB2Jgan1znP93p - Sandeep Sharma
3个回答

5
你可以使用 http.get(Url, Headers Map) 函数并在 header map 中手动创建 cookie,但是使用 HttpClient 在请求中包含cookie更容易:
import 'dart:convert';
import 'dart:io';

import 'package:html/dom.dart';
import 'package:html/parser.dart' as parser;

parseHtml() async {
  HttpClient client = new HttpClient();
  HttpClientRequest clientRequest =
      await client.getUrl(Uri.parse("http: //www.example.com/"));
  clientRequest.cookies.add(Cookie("sessionid", "asdasdasqqwd"));
  HttpClientResponse clientResponse = await clientRequest.close();
  clientResponse.transform(utf8.decoder).listen((body) {
    Document document = parser.parse(body);
    print(document.text);
  });
}

嘿,你能看一下这个问题吗?https://dev59.com/yXcPtIcB2Jgan1znP93p - Sandeep Sharma

5
为了补充答案:

在IT技术方面,需要注意以下几点:

import 'dart:convert';
import 'dart:io';

import 'package:html/dom.dart';
import 'package:html/parser.dart' as parser;

parseHtml() async {
  HttpClient client = new HttpClient();
  HttpClientRequest clientRequest =
      await client.getUrl(Uri.parse("http://www.example.com/"));
  clientRequest.cookies.add(Cookie("sessionid", "asdasdasqqwd"));
  HttpClientResponse clientResponse = await clientRequest.close();
  clientResponse.transform(utf8.decoder).listen((body) {
    Document document = parser.parse(body);
    print(document.text); // null

    for(Element element in document.getElementsByClassName('your_class')) {
      ...
    }
  });
}

上面的代码运行得非常好,下面的代码同样也能完美运行:
parseHtml() async {
  http.Response response = await http.get(
    'http://www.example.com/',
    headers: {'Cookie': 'sessionid=asdasdasqqwd'}
  );
  Document document = parser.parse(response.body);
  print(document.text); // null

  for(Element element in document.getElementsByClassName('your_class')) {
    ...
  }
}

2
我使用了以下方法,除了rafaelcb21上面的回答:

String stringifyCookies(Map<String, String> cookies) =>
      cookies.entries.map((e) => '${e.key}=${e.value}').join('; ');

// Used like so..
http.response response = await http.get(
      'https://google.com', 
      headers: { 'Cookie': stringifyCookies(cookies) });

它在上面的第一行被定义。 - FloatingRock
1
好的且动态的解决方案。 - Son Tieu
嘿,你能看一下这个问题吗?https://dev59.com/yXcPtIcB2Jgan1znP93p - Sandeep Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接