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