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 GET
s and POST
s through it.
===
import 'package:http/http.dart' as http; import 'dart:convert';
class Session { Mapheaders = {}; Future get(String url) async { http.Response response = await http.get(url, headers: headers); updateCookie(response); return response.body; } Future 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 { Mapheaders = {}; Future
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(); Mapheaders = {"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); }); }}