前几天我在这里做了类似的问题: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字典中的字符串。
答案 0 :(得分:7)
您忘记将数据放在 params 关键字中:
使用正确的语法:
data = {“ params ”:dict(key =“value”)}
data = {
"params": {
"name":"prakashsharma",
"email":"prakashsharmacs24@gmail.com",
"phone":"+917859884833"
}
}
在请求json格式的资源时,请不要忘记使用json.dumps(data)
和'Content-Type': 'application/json'
。
我很确定你的问题在使用我的朋友之后会得到解决...干杯:)!
答案 1 :(得分:0)
上帝保佑Forvas :: 但为了更清楚: 如果你想通过cURL进行测试:
curl -i -X POST -H "Content-Type: application/json" -d '{"params": {"name":"prakashsharma","email":"prakashsharmacs24@gmail.com","phone":"+917859884833"}}' 'http://localhost:8069/web/yourlistoner/'
如果你想通过python请求进行测试:
import requests
headers = {
'Content-Type': 'application/json',
}
data = '{"params": {"name":"prakashsharma","email":"prakashsharmacs24@gmail.com","phone":"+917859884833"}}'
requests.post('http://localhost:8069/web/yourlistoner/', headers=headers, data=data)
odoo中的函数将类似于
from odoo import http
import json
class YourClass(http.Controller):
@http.route('/web/yourlistoner/', type='json', auth="none", methods=['POST'],cors="*", csrf=False)
def listoner(self, **kw):
print http.request.params
print "lllllllllllllllllllll"
return json.dumps({"result":"Success"})
答案 2 :(得分:0)
您可以将以下格式用于POST请求
{
"params" : {
"name" : "Order/1/18",
"session_id" : 1,
"customer_count" : 2,
"partner_id" : 9,
"lines": [
{
"product_id": 37,
"qty" : 2,
"price_unit" : 2,
"discount" : 10
}
],
"pos_reference" : 2,
"note" : "This is a test note"
}
}
内容类型必须为application / json
odoo路线将如何处理请求?
@http.route(['/api/v1/resources/<string:api_key>/pos_order'],
auth="public",
website=False,
type="json",
csrf=False,
methods = ['POST'])
def create_update_pos_order(self, api_key=None, **kwargs):
print(kwargs.get('name')) -> Order/1/18