• cookie ====================


    https://stackoverflow.com/questions/52241089/how-do-i-make-an-http-request-using-cookies-on-flutter?rq=1

    Here's an example of how to grab a session cookie and return it on subsequent requests. You could easily adapt it to return multiple cookies. Make a Session class and route all your GETs and POSTs through it.

    ===Richard Heap

    import 'package:http/http.dart' as http;
    import 'dart:convert';

    class Session {
      Map<String, String> headers = {};
    
      Future<String> get(String url) async {
        http.Response response = await http.get(url, headers: headers);
        updateCookie(response);
        return response.body;
      }
    
      Future<String> post(String url, dynamic data) async {
        http.Response response = await http.post(url, body: data, headers: headers);
        updateCookie(response);
        return response.body;
      }
    
      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);
        }
      }
    }
    

      




    class Session {
      Map<String, String> headers = {};
    
      Future<Map> get(String url) async {
        http.Response response = await http.get(url, headers: headers);
        updateCookie(response);
        return json.decode(response.body);
      }
    
      Future<Map> post(String url, dynamic data) async {
        http.Response response = await http.post(url, body: data, headers: headers);
        updateCookie(response);
        return json.decode(response.body);
      }
    
      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);
        }
      }
    }
    

      

    I have improved the Richard Heap's solution to be capable to process multiple 'Set-cookies' and multiple cookies.

    In my case, the server returns multiples 'Set-cookies'. The http package concatenate all the set-cookies headers in one header and separate it by comma (',').

    class NetworkService {
    
      final JsonDecoder _decoder = new JsonDecoder();
      final JsonEncoder _encoder = new JsonEncoder();
    
      Map<String, String> headers = {"content-type": "text/json"};
      Map<String, String> cookies = {};
    
      void _updateCookie(http.Response response) {
        String allSetCookie = response.headers['set-cookie'];
    
        if (allSetCookie != null) {
    
          var setCookies = allSetCookie.split(',');
    
          for (var setCookie in setCookies) {
            var cookies = setCookie.split(';');
    
            for (var cookie in cookies) {
              _setCookie(cookie);
            }
          }
    
          headers['cookie'] = _generateCookieHeader();
        }
      }
    
      void _setCookie(String rawCookie) {
        if (rawCookie.length > 0) {
          var keyValue = rawCookie.split('=');
          if (keyValue.length == 2) {
            var key = keyValue[0].trim();
            var value = keyValue[1];
    
            // ignore keys that aren't cookies
            if (key == 'path' || key == 'expires')
              return;
    
            this.cookies[key] = value;
          }
        }
      }
    
      String _generateCookieHeader() {
        String cookie = "";
    
        for (var key in cookies.keys) {
          if (cookie.length > 0)
            cookie += ";";
          cookie += key + "=" + cookies[key];
        }
    
        return cookie;
      }
    
      Future<dynamic> get(String url) {
        return http.get(url, headers: headers).then((http.Response response) {
          final String res = response.body;
          final int statusCode = response.statusCode;
    
          _updateCookie(response);
    
          if (statusCode < 200 || statusCode > 400 || json == null) {
            throw new Exception("Error while fetching data");
          }
          return _decoder.convert(res);
        });
      }
    
      Future<dynamic> post(String url, {body, encoding}) {
        return http
            .post(url, body: _encoder.convert(body), headers: headers, encoding: encoding)
            .then((http.Response response) {
          final String res = response.body;
          final int statusCode = response.statusCode;
    
          _updateCookie(response);
    
          if (statusCode < 200 || statusCode > 400 || json == null) {
            throw new Exception("Error while fetching data");
          }
          return _decoder.convert(res);
        });
      }
    }
    

      

  • 相关阅读:
    部署阿里云服务器流程小结
    爬虫中代理的设置问题介绍
    简析 __init__、__new__、__call__ 方法
    Python3.* 和Python2.*的区别
    解决k8s svcat ServiceInstance 删除不掉问题
    k8s dashboard部署,使用traefik暴露问题记录
    python中all函数得用法
    使用Hexo+github搭建个人博客大坑
    使用scrapy爬取百度招聘
    还是爬虫,使用的是selenium,爬取的是智联,爬取速度灰常慢...
  • 原文地址:https://www.cnblogs.com/pythonClub/p/10717814.html
Copyright © 2020-2023  润新知