jsonrpc
JsonRPC是一种基于JSON(JavaScript Object Notation)的轻量级远程过程调用协议。与其他RPC协议相比,JsonRPC使用简单的文本格式进行通信,易于阅读和编写,广泛应用于Web服务的分布式系统中。
import json
import random
import requests
server_url = 'http://localhost:9099'
db_name = 'testodoo'
username = 'admin'
password = '1'
json_endpoint = "%s/jsonrpc" % server_url
headers = {"Content-Type": "application/json"}
def get_json_payload(service, method, *args):
kwargs = kwargs or {}
return json.dumps({
"jsonrpc": "2.0", # jsonrpc版本 一般为2.0
"method": 'call', # 调用远程的方法名称
"params": { # 传给远程的参数
"service": service,
"method": method,
"args": args
},
"id": random.randint(0, 1000000000), # 请求唯一标识符 用于匹配请求和相应
})
payload = get_json_payload("common", "login", db_name, username, password)
response = requests.post(json_endpoint, data=payload, headers=headers)
user_id = response.json()['result']
if user_id:
print("Success: User id is", user_id)
else:
print("Failed: wrong credentials")
查询
# 搜索房间的 ID
search_domain = [['name', 'ilike', 'Standard']]
payload = get_json_payload("object", "execute_kw",
db_name, user_id, password,
'hostel.room', 'search', [search_domain], {'limit': 5})
res = requests.post(json_endpoint, data=payload, headers=headers).json()
print('Search Result:', res) # ID 将位于结果键中
# 读取房间 ID 的数据
payload = get_json_payload("object", "execute_kw",
db_name, user_id, password,
'hostel.room', 'read', [res['result'], ['name', 'room_no']])
res = requests.post(json_endpoint, data=payload, headers=headers).json()
print('Rooms data:', res)
search_domain = [['room_no', 'ilike', '1']]
payload = get_json_payload("object", "execute_kw",
db_name, user_id, password,
'hostel.room', 'search_read', [search_domain, ['name', 'room_no']], {'limit': 5})
res = requests.post(json_endpoint, data=payload, headers=headers).json()
print('Rooms data:', res)
创建
payload = get_json_payload("object", "execute_kw",
db_name, user_id, password,
'hostel.room', 'check_access_rights', ['create'])
res = requests.post(json_endpoint, data=payload, headers=headers).json()
print("Has create access:", res['result'])
create_data = [
{'name': 'Room 1', 'room_no': '201'},
{'name': 'Room 3', 'room_no': '202'},
{'name': 'Room 5', 'room_no': '205'},
{'name': 'Room 7', 'room_no': '207'}
]
payload = get_json_payload("object", "execute_kw", db_name, user_id, password, 'hostel.room', 'create',
[create_data])
res = requests.post(json_endpoint, data=payload, headers=headers).json()
print("Rooms created:", res)
rooms_ids = res['result']
更新
room_to_write = rooms_ids[1]
write_data = {'name': 'Room 2'}
payload = get_json_payload("object", "execute_kw", db_name, user_id, password, 'hostel.room', 'write',
[room_to_write, write_data])
res = requests.post(json_endpoint, data=payload, headers=headers).json()
print("Rooms written:", res)
删除
room_to_unlink = rooms_ids[2:]
payload = get_json_payload("object", "execute_kw", db_name, user_id, password, 'hostel.room', 'unlink',
[room_to_unlink])
res = requests.post(json_endpoint, data=payload, headers=headers).json()
print("Rooms deleted:", res)
函数方法
# 通过调用 make_available 方法更改房间状态
payload = get_json_payload("object", "execute_kw",
db_name, user_id, password,
'hostel.room', 'make_available', [room_id])
res = requests.post(json_endpoint, data=payload, headers=headers).json()
# 方法调用后检查房间状态
payload = get_json_payload("object", "execute_kw",
db_name, user_id, password,
'hostel.room', 'read', [room_id, ['name', 'state']])
res = requests.post(json_endpoint, data=payload, headers=headers).json()
print("Room state after the method call:", res['result'])