服務端接收參考:
# 導包
from odoo import http
class HttpRequest(http.Controller):
@http.route('/url', type='json', auth='public', website=True)
def server_method(self, *args, **kwargs):
# *args, **kwargs接收參數
pass
# route中的參數可以參考odoo/http.py文件里def route(route=None, **kw)方法
# type在這里選擇json
提供一個操作model(創建、修改)報權限問題的解決方法:
# 需要導入odoo
import odoo
# http.request.env['model'].create() 前加入下面這句話,會用超級管理員執行操作。若擔心問題的話,可以使用登錄的方法,這里暫不做演示
http.request.uid = odoo.SUPERUSER_ID
-
客戶端發送參考
-
import requests, json
data = {"params":param}
# 這個param代表需要傳入的參數,params這個key非常重要,只有帶了這個key,服務端才能接受到參數
# 可以參考odoo/http.py文件里 class JsonRequest(WebRequest) 類,明確說明了
requests.post(url='http://localhost:8069/url', data=json.dumps(data))
# 說明一下,resquest中post這個api會根據data的數據類型自動轉換請求頭里Content-Type對應的參數
或者通過工具postman測試:

最后值得注意的地方
- 服務端
type='json'
- 客戶端
data中一定要加入params
數據需要轉成Json
案例1
如何使用type =’json’在Odoo控制器中獲取JSON數據?
但現在,我需要創建一個只接收JSON數據的控制器.所以,我正在通過Python控制台執行請求,這樣:
import requests
import json
url = 'http://localhost:8069/odoo/test'
headers = {'Content-Type': 'application/json'}
data = {
'name': 'teddy',
'email': 'teddy.doe@gmail.com',
}
data_json = json.dumps(data)
r = requests.post(url=url, data=data_json, headers=headers)
import openerp.http as http
from openerp.http import Response
import logging
_logger = logging.getLogger(__name__)
class WebFormController(http.Controller):
@http.route('/odoo/test', type='json',
auth='public', methods=['POST'], website=True)
def index(self, **args):
_logger.info('CONNECTION SUCCESSFUL')
_logger.info(args)
name = args.get('name', False)
email = args.get('email', False)
_logger.info(name)
_logger.info(email)
if not name:
Response.status = '400 Bad Request'
return '{"response": "OK"}'
問題是我在控制器中收到一個空的JSON.我可以在日志中讀取CONNECTION SUCCESFUL,沒有錯誤,但是當我顯示args時,我得到{},顯然由於這個原因,在寫名字和電子郵件時為False.
如果我將數據作為Python字典或字符串傳遞,我會收到以下錯誤:
無效的JSON數據:’name = teddy& email=teddy.doe@gmail.com’或
無效的JSON數據:“{‘name’:’teddy’,’email’:’teddy.doe @ gmail.com’}”.
如果我修改type =’json’而我寫了type =’http’,我會收到以下錯誤:
聲明的函數能夠處理類型為“http”的請求,但是使用類型為“json”的請求進行調用.
我已經讀過如果使用參數json而不是數據發送請求可能會解決這個問題,這樣:
r = requests.post(url=url, json=data_json, headers=headers)
不幸的是,要發出請求的服務器有一個舊的操作系統無法更新python-requests包,所以我不能使用json參數,因為它在該服務器上安裝的版本中不存在.
忘記將數據放在params關鍵字中:
使用以下正確的語法:
data = {“params“: dict(key=”value”)}
data = {
"params": {
"name":"prakashsharma", "email":"prakashsharmacs24@gmail.com", "phone":"+917859884833" } }
在請求json格式的資源時,請不要忘記使用json.dumps(data)和’Content-Type’:’application / json’.
案例來源:http://www.voidcn.com/article/p-kionqzww-bvc.html