如何使用 type='json' 在 Odoo 控制器中获取 JSON 数据?
Posted
技术标签:
【中文标题】如何使用 type=\'json\' 在 Odoo 控制器中获取 JSON 数据?【英文标题】:How to get JSON data in an Odoo controller using type='json'?如何使用 type='json' 在 Odoo 控制器中获取 JSON 数据? 【发布时间】:2016-05-09 09:19:18 【问题描述】:几天前我在这里做了一个类似的问题: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
和@ 时987654330@.
如果我将数据作为 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 字典中的字符串。
【问题讨论】:
也许你缺少 csrf_token? 感谢您回答@mokiSRB,但csrf_token
是Odoo 9 的新功能,我正在使用Odoo 8,所以这应该不是问题。我在 Odoo 中看到了其他 JSON 控制器,它们都是从 javascript 调用的,带有 openerp.jsonRpc
之类的库。如何从一个简单的 Python 脚本(例如使用 requests
)向控制器发送数据?
当我使用 rest api 和 Odoo 时,我通常从 Postman 查询开始,然后复制代码,由于某些原因,请求不适用于 curl
,但它适用于 postman,这是由于到需要转义的双引号符号,另见:***.com/questions/32122586/curl-escape-single-quote/…
【参考方案1】:
您刚刚忘记将数据放入 params 关键字中:
使用正确的语法:
data = "params": dict(key="value")
data =
"params":
"name":"prakashsharma",
"email":"prakashsharmacs24@gmail.com",
"phone":"+917859884833"
在请求 json 格式的资源时,请不要忘记使用 json.dumps(data)
和 'Content-Type': 'application/json'
。
我非常确定在使用我的朋友后,您的问题将得到解决...干杯:)!!
【讨论】:
这正是问题所在!你帮了我很多!非常感谢我的朋友! @forvas:可以从其他平台访问吗?每当我尝试从 Postman 访问此 url 时,它都会返回 404。但可以从用户登录的浏览器访问。 @MuneerMuhammed 是的,事实上,一个客户的网站正在将这些 JSON 数据发送到我的 Odoo。【参考方案2】:您可以使用以下格式进行 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 路由将如何处理请求?
Route 将帮助在 odoo [POST] 中创建 POS 订单
@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
【讨论】:
【参考方案3】:上帝保佑福瓦斯:: 但为了更清楚: 如果你想通过 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")
【讨论】:
以上是关于如何使用 type='json' 在 Odoo 控制器中获取 JSON 数据?的主要内容,如果未能解决你的问题,请参考以下文章
如果第一个 JSON 参数不是“params”,如何从 Odoo 中的 Webhook 访问数据?