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

for*_*vas 6 json controller python-2.7 odoo odoo-8

几天前我在这里做了一个类似的问题:如何在Odoo控制器中获取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)
Run Code Online (Sandbox Code Playgroud)

我创建了一个监听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"}'
Run Code Online (Sandbox Code Playgroud)

问题是我在控制器中收到一个空的JSON.我可以读连接成功的在日志中,并没有错误,但是当我展示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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,要发出请求的服务器有一个旧的操作系统无法更新python-requests软件包,所以我不能使用json参数,因为它在该服务器上安装的版本中不存在.

拜托,任何人都可以帮助我吗?我需要在控制器中获取JSON数据,而不是Python字典中的字符串.

Pra*_*mar 9

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

使用以下正确的语法:

data = {" params ":dict(key ="value")}

data = {
    "params": {
        "name":"prakashsharma",
        "email":"prakashsharmacs24@gmail.com",
        "phone":"+917859884833"
    }
}
Run Code Online (Sandbox Code Playgroud)

请不要忘了使用json.dumps(data),并'Content-Type': 'application/json'同时要求一个JSON格式的资源.

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