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

后端 未结 4 945
花落未央
花落未央 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条回答
  •  旧时难觅i
    2020-12-09 03:21

    I found best solution to handle cookies for redirect also

    import 'dart:convert';
    import 'dart:io';
    
    class CustomHTTPClient{
      final HttpClient _client = new HttpClient();
      Map _cookies = Map();
    
      CustomHTTPClient(){
        _client.connectionTimeout = Duration(seconds: 10);
      }
    
      Future get(String url, {int maxRedirect = 3}) async {
        final parsedUrl = Uri.parse(url);
        return await _client.getUrl(parsedUrl)
            .then((HttpClientRequest request) {
          request.followRedirects = false;
          _beforeRequest(request);
          return request.close();
        }).then((HttpClientResponse response) async {
          _afterResponse(response);
          if(response.isRedirect && maxRedirect > 0){
            return await response.drain().then((value) => get(parsedUrl.resolve(response.headers.value('location')).toString(), maxRedirect: maxRedirect - 1));
          }
          return response.transform(utf8.decoder).join();
        }).catchError((error, stack){
          print(error);print(stack);
        });
      }
    
      void _beforeRequest(HttpClientRequest request){
        request.headers.set(HttpHeaders.acceptEncodingHeader, 'gzip, deflate, br');
    
        // Set cookie
        final String rawCookies = _cookies.keys.map((String name) => '$name=${_cookies[name]}').join('; ');
        if(rawCookies.isNotEmpty) request.headers.set(HttpHeaders.cookieHeader, rawCookies);
      }
    
      void _afterResponse(HttpClientResponse response){
        response.headers.forEach((String name, List values){
          if(name == 'set-cookie'){ // Get cookies for next request
            values.forEach((String rawCookie){
              try{
                Cookie cookie = Cookie.fromSetCookieValue(rawCookie);
                _cookies[cookie.name] = cookie.value;
              } catch(e){
                final List cookie = rawCookie.split(';')[0].split('=');
                _cookies[cookie[0]] = cookie[1];
              }
            });
            return false;
          }
        });
      }
    }
    

提交回复
热议问题