How do I make an http request using cookies on flutter?

后端 未结 4 944
花落未央
花落未央 2020-12-09 03:11

I\'d like to make an http request to a remote server while properly handling cookies (eg. storing cookies sent by the server, and sending those cookies when I make subsequen

4条回答
  •  南笙
    南笙 (楼主)
    2020-12-09 03:29

    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 headers = {"content-type": "text/json"};
      Map 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 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 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);
        });
      }
    }
    

提交回复
热议问题