我在想,如何才能将我的会话Id从登录发送到flutter中的其他rest api调用。我在这里的情况是,我希望有一个登录屏幕和产品列表页面。我成功地开发了带身份验证的登录页面。以下是代码片段
登录按钮:
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",
}
}
Cookie:
[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 );
}
以下是接受上述接口调用:slight_smile的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
}
#列出所有产品GET方法
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
请编辑我的fetchProducts()方法,以便通过会话从api获取响应。
发布于 2021-04-02 06:00:30
您需要使用cookie manager
示例
import 'package:dio/dio.dart';
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
import 'package:cookie_jar/cookie_jar.dart';
main() async {
var dio = Dio();
var cookieJar=CookieJar();
dio.interceptors.add(CookieManager(cookieJar));
// first request, and save cookies (CookieManager do it).
await dio.get("https://baidu.com/");
// Print cookies
// print(await cookieJar.loadForRequest(Uri.parse("https://baidu.com/")));
// second request with the cookies
await dio.get("https://baidu.com/");
...
}
https://stackoverflow.com/questions/64497445
复制相似问题