Как получить данные JSON в контроллере Odoo с помощью type= 'json'?

несколько дней назад я сделал подобный вопрос здесь: как получить данные JSON в контроллере Odoo?

но теперь мне нужно создать контроллер, который получает данные 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 в контроллер. Я умею читать!--28-->ПОДКЛЮЧЕНИЕ К УСПЕШНОЙ в журнале, без ошибок, но когда я показываю 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.

2 ответов


вы просто забыли поместить свои данные внутри params ключевые слова:

Используйте правильный синтаксис :

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

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

пожалуйста, не забудьте использовать json.dumps(data) и 'Content-Type': 'application/json' при запросе ресурса в формате 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"})