【问题标题】:Dart - Request GET with cookieDart - 使用 cookie 请求 GET
【发布时间】:2018-08-20 01:13:00
【问题描述】:

我正在尝试发出获取请求,但我需要放置 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 吗?

【问题讨论】:

    标签: request dart setcookie


    【解决方案1】:

    您可以使用http.get(Url, Headers 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);
      });
    }
    

    【讨论】:

      【解决方案2】:

      补充答案:

      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')) {
          ...
        }
      }
      

      【讨论】:

        【解决方案3】:

        除了上面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) });
        

        【讨论】:

        • 上面第一行定义的
        • 好的动态解决方案。
        猜你喜欢
        • 2020-01-24
        • 2021-09-28
        • 2020-10-10
        • 2014-04-30
        • 1970-01-01
        • 2012-01-16
        • 2015-12-07
        • 2016-01-25
        • 1970-01-01
        相关资源
        最近更新 更多