2016-10-04 4 views
2

Я пробовал разные способы сделать это, но они не сработали.Как отправить простое сообщение и статус как ответ в контроллере Odoo JSON?

Сначала я попробовал этот путь:

import openerp.http as http 
from openerp.http import Response 

class ResPartnerController(http.Controller): 

    @http.route('/odoo/create_partner', type='json', auth='none') 
    def index(self, **kwargs): 

    Response.status = '400' 
    return "Result message" 

я получаю правильный статус и сообщение в клиенте. Но я получаю это странное предупреждение, если я делать какие-либо действия на интерфейсе Odoo

enter image description here

Есть ли способ избежать этого сообщения?

Я попробовал это оба пути, а также:

data = {'result': 'RESULT message'} 
json_data = json.dumps(data, encoding='utf-8') 
headers = [('Content-Type', '{}; charset=utf-8'.format('application/json'))] 
mimetype = 'application/json' 
res = Response(
    response=json_data, 
    status=status, 
    headers=headers, 
    mimetype=mimetype, 
) 
return res 
msg = u'Response 200 badly built, falling back to a simple 200 OK response' 
res = Response(msg, status=200) 
return res 

Но я всегда получаю эту ошибку как ответ на клиенте:

TypeError: <Response 9 bytes [400 BAD REQUEST]> is not JSON serializable\n", "message": "<Response 9 bytes [400 BAD REQUEST]> is not JSON serializable" 

Итак, есть чистый способ ответа на простое сообщение со статусом ответа?

Это важно для меня, чтобы отправить статус ответа, а

Если я просто ответить сообщение все работает нормально, но как изменить статус без посторонних поведения?

Кстати, я использую этот скрипт, чтобы делать звонки

# -*- coding: utf-8 -*- 

import requests 
import json 

url = 'http://localhost:8069/odoo/create_partner' 
headers = {'Content-Type': 'application/json'} 

data_res_partner = { 
    'params': { 
     'name': 'Example', 
     'email': '[email protected]', 
    } 
} 

data_json = json.dumps(data_res_partner) 
response = requests.post(url=url, data=data_json, headers=headers) 
print(response.status_code) 
print(response.content) 

Update

Наконец @Phillip Stack сказал мне, чтобы сделать это с помощью XML-RPC, так что я написал эту other question в чтобы разъяснить мои сомнения.

+0

что определение контроллера, как? это контроллер 'json' или' http'? какие просьбы он принимает ?. мы можем, вероятно, догадаться об этих деталях, но лучше всего включить полный код вашего контроллера вместо '[...]' – danidee

+1

Из внешнего вида внешнего скрипта вы пытаетесь создать интерфейс отдыха для создания контакта. Вы должны действительно использовать jsonrpc или xmlrpc, поскольку эта структура уже существует, чтобы делать то, что вы пытаетесь достичь. –

+0

Спасибо за ваш комментарий @phillipstack. Затем, когда я должен использовать контроллер? Нужно ли только показывать веб-сайты в качестве ответа? – ChesuCR

ответ

1

Попробуйте это, я не уверен, насколько я понимаю все связанные с этим сложности. Попробуйте выполнить ванильный запрос и проанализируйте ответ как json как работу. Если я выясню запрос/ответ json, я обновлю это. У меня были такие же проблемы, как и у вас, но я смог получить следующее.

Попробуйте для типа HTTP

@http.route('/test/test', auth='none', type='http') 
def test(self, **kwargs): 
    return Response("TEST",content_type='text/html;charset=utf-8',status=500) 

Мой запрос выглядит следующим образом.

r = requests.post("http://localhost:8069/test/test",data={}))  
>>> r 
<Response [500]> 
>>> r.text 
u'TEST' 

Попробуйте для типа JSON

@http.route('/test/test', auth='none', type='json') 
def test(self, **kwargs): 
    Response.status = '400' 
    return {'test':True} 

Используя запрос структурированную, как это.

json_data = {"test": True} 

requests.post("http://localhost:8069/test/test",data=json.dumps(json_data),headers={"Content-Type":"application/json"}) 

Используйте вышеуказанное для запроса python.

Используйте пример ниже JavaScript

var json_data = { 'test': true }; 

$.ajax({ 
     type: "POST", 
     url: "/test/test", 
     async: false, 
     data: JSON.stringify(json_data), 
     contentType: "application/json", 
     complete: function (data) { 
      console.log(data); 
     } 
}); 
+0

Спасибо за ваш ответ. Я пробовал ваш код, но я уверен, что вы сказали, что это json-контроллер, поэтому я получаю эту ошибку 'TypeError: не JSON serializable'. Взгляните на мой вопрос еще раз, я обновил его с помощью большего количества строк контроллера :) – ChesuCR

+0

Я обновил свою публикацию. Хотя тривиальный пример это работает для меня. –

+0

Если я делаю 'Response.status = '400'', я получаю сообщение об ошибке в интерфейсе, поскольку я написал вопрос о проблеме. После этого я больше не могу делать какие-либо действия в Odoo, потому что ошибка всегда появляется – ChesuCR