几天前我在这里做了类似的问题:How to get JSON data in an Odoo controller?
但是现在,我需要创建一个只接收JSON数据的控制器 . 所以,我这样做是从Python控制台做的请求:
import requests
import json
url = 'http://localhost:8069/odoo/test'
headers = {'Content-Type': 'application/json'}
data = {
'name': 'Jane',
'email': 'jane.doe@gmail.com',
}
data_json = json.dumps(data)
r = requests.post(url=url, data=data_json, headers=headers)
我创建了一个监听http://localhost:8069/odoo/test的控制器,这样:
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
在写 name
和 email
时 .
如果我将数据作为Python字典或字符串传递,我会收到以下错误:
分别为 Invalid JSON data: 'name=Jane&email=jane.doe%40gmail.com'
或 Invalid JSON data: "{'name': 'Jane', 'email': 'jane.doe@gmail.com'}"
.
如果我修改 type='json'
而我写了 type='http'
,我收到以下错误:
Function declared as capable of handling request of type 'http' but called with a request of type 'json'
.
我已经读过,如果使用参数 json
而不是 data
发送请求,可能会解决这个问题,这样:
r = requests.post(url=url, json=data_json, headers=headers)
不幸的是,要发出请求的服务器有一个旧的操作系统无法更新 python-requests
包,所以我不能使用 json
参数,因为它在该服务器上安装的版本中不存在 .
拜托,有人可以帮帮我吗?我需要在控制器中获取JSON数据,而不是Python字典中的字符串 .
3 回答
您忘记将数据放在 params 关键字中:
使用以下正确的语法:
在请求json格式的资源时,请不要忘记使用
json.dumps(data)
和'Content-Type': 'application/json'
.我很确定你的问题将在使用这个我的朋友后得到解决...干杯:)!
上帝保佑Forvas ::但为了更清晰:如果你想通过cURL测试:
如果你想通过python请求测试:
odoo中的功能就像是
您可以使用以下格式的POST请求
内容类型必须是application / json
How odoo route will handle request ?
Route将有助于在odoo [POST]中创建POS订单