zoukankan      html  css  js  c++  java
  • 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);
        });
      }
    }
    

      

  • 相关阅读:
    Android 禁用以及捕捉home键
    android中正确导入第三方jar包
    使用SharedPreferences进行数据存储
    tomcat不安全因素
    spring边边角角
    宏定义
    C++变量对比java变量所占内存
    结构指针的分析
    对结构使用指针
    什么是程序文件?
  • 原文地址:https://www.cnblogs.com/pythonClub/p/10717814.html
Copyright © 2011-2022 走看看