Flutter 如何在dio resquest中传递cookie/会话id?

Flutter 如何在dio resquest中传递cookie/会话id?,flutter,dio,Flutter,Dio,我想知道如何将会话Id从登录名发送到颤振中的其他RESTAPI调用。我的情况是,我想有一个登录屏幕和产品列表页面。我成功地开发了带有身份验证的登录页面。下面是代码片段 登录按钮: RaisedButton( onPressed: () { ApiProvider().userLogin().then((value) => {}); }, child: Text('Login'), ) A

我想知道如何将会话Id从登录名发送到颤振中的其他RESTAPI调用。我的情况是,我想有一个登录屏幕和产品列表页面。我成功地开发了带有身份验证的登录页面。下面是代码片段

登录按钮:

 RaisedButton(
          onPressed: () {
            ApiProvider().userLogin().then((value) => {});
          },
          child: Text('Login'),
        )
ApiProiver.dart:

 Future userLogin() async {
   var options = Options(
    headers: {"Content-Type": "application/json"},
   );
  var body ={
   "jsonrpc" : "2.0",
   "params":{
    "login":"admin",
    "password":"admin",
    "db":"food_app"
  }
 };

 Response response = await dio.post('http://food_app.com/web/session/authenticate',options:options, 
 data: body);
 print("Response $response");
 final cookies = response.headers.map['set-cookie'];
 print("Cookie,$cookies");
}
输出:

  Response :

  {"jsonrpc": "2.0", 
    "id": null,
    "result": 
            {"uid": 2, 
             "is_system": true, 
             "is_admin": true, 
             "db": "food_app",   
            "name":  "Administrator", 
            "username": "admin", 
           "web.base.url": "http://food_app.com",
   }
 }
曲奇:

[session_id=d446d3ef6bd536ef8e0bf6f1c9ba3a40c92ccb99; Expires=Thu, 21-Jan-2021 08:59:42 
GMT; Max-Age=7776000; HttpOnly; Path=/]

Result is ok!!!!!!!!!!!!!!!
我从上面的代码中获得cookies/会话id,现在我的问题是如何将会话id传递给下一个api调用

Future fetchProducts() async {
 var options = Options(
   headers: {"Content-Type": "application/json"},
  );
  var body =
     {
       "jsonrpc" : "2.0",
      "params":{ }
     };
  Response response = await dio.post('http://food_app.com/api/get_products',options: options, data:body );
  }
以下是接受上述api调用的python测试脚本:

 odoo_url = "https://food_app.com"

 headers = {'Content-type': 'application/json'}

 myobj = {"jsonrpc":"2.0","params":{'db':'food_app','login':'admin','password':'admin'}}
     
 session_details = requests.get(url=odoo_url + '/web/session/authenticate', data=json.dumps(myobj), 
                                  headers=headers)
 session_id = str(session_details.cookies.get('session_id'))
 print("Session id")
 print(session_id)
 cookies = {
 'session_id': session_id
}    
#列出所有产品的获取方法

 url_get = 'http://food_app.com/api/get_products'
 headers = {'Content-type': 'application/json'}
get_products = requests.get(url_get, cookies=cookies)
json_data = json.loads(get_products.text)
for product in json_data['response']:
  print(product['name'])
上面的python代码命中api并返回正确的响应

Session :
8a1f03ff94459c6a30d3be6cbdf3e8ca9b1ee23c

Product Names:
Calamari & Rice in Orange Souce
Chicken Wings in Buffalo Sauce
Mixed Vegatables, Paprika & Chips - Dish 1
New York Strip Steak  
Roasted Brussels Sprout Salad
Salmon in Carrot Souce
Vegetable Salad with Avocado & Rice
请编辑my fetchProducts()方法,以便通过会话从api获取响应。

您需要使用

范例

import'包:dio/dio.dart';
导入“package:dio_cookie_manager/dio_cookie_manager.dart”;
导入“package:cookie_-jar/cookie_-jar.dart”;
main()异步{
var-dio=dio();
var cookieJar=cookieJar();
添加(CookieManager(cookieJar));
//首先请求并保存cookies(CookieManager执行此操作)。
等待迪奥。得到(“https://baidu.com/");
//打印cookies
//打印(等待cookieJar.loadForRequest(Uri.parse()https://baidu.com/")));
//第二个请求是cookies
等待迪奥。得到(“https://baidu.com/");
... 
}