首页 文章

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

提问于
浏览
6

几天前我在这里做了类似的问题: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 在写 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字典中的字符串 .

3 回答

  • 6

    您忘记将数据放在 params 关键字中:

    使用以下正确的语法:

    data = {“params”:dict(key =“value”)}

    data = {
        "params": {
            "name":"prakashsharma",
            "email":"prakashsharmacs24@gmail.com",
            "phone":"+917859884833"
        }
    }
    

    在请求json格式的资源时,请不要忘记使用 json.dumps(data)'Content-Type': 'application/json' .

    我很确定你的问题将在使用这个我的朋友后得到解决...干杯:)!

  • 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"})
    
  • 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

    How odoo route will handle request ?

    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
    

相关问题