如何使用 type='json' 在 Odoo 控制器中获取 JSON 数据?

How to get JSON data in an Odoo controller using type='json'?

几天前我在这里做了一个类似的问题:

但是现在,我需要创建一个只接收 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 当写 nameemail.

如果我将数据作为 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 字典中的字符串。

您刚刚忘记将数据放入 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:: 但为了更清楚: 如果您想通过 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"}) 

您可以使用以下格式进行 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 路由将如何处理请求?

路线将有助于在 odoo 中创建 POS 订单 [POST]

@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