如何在 Odoo JSON 控制器中发送简单的消息和状态作为响应?

Posted

技术标签:

【中文标题】如何在 Odoo JSON 控制器中发送简单的消息和状态作为响应?【英文标题】:How to send a simple message and status as a response in an Odoo JSON controller? 【发布时间】:2016-10-04 09:38:46 【问题描述】:

我尝试了不同的方法,但没有奏效。

首先我是这样尝试的:

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 界面上执行任何操作,我会收到这个奇怪的警告

有没有办法避免这个消息?

我也尝试了这两种方法:

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': 'jamon@test.com',
    


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

更新

最后@Phillip Stack 告诉我用 XML-RPC 来做这件事,所以我写了这个other question 来澄清我的疑惑。

【问题讨论】:

你的控制器的定义是怎样的?是json 还是http 控制器?它接受什么样的请求?我们可能会猜到这些细节,但最好包含控制器的完整代码,而不是 [...] 从您的外部脚本的外观来看,您正在尝试创建一个休息界面来创建一个联系人。您真的应该使用 jsonrpc 或 xmlrpc,因为这种结构已经存在,可以完全完成您似乎想要完成的工作。 感谢您的评论@phillipstack。那么,什么时候应该使用控制器呢?是否只需要显示网站作为响应? 我写了一个different question来问这个问题 我遇到了和你一样的错误***.com/questions/58426988/… 【参考方案1】:

试试这个,我不确定我是否理解这里所涉及的所有复杂性。尝试一个 vanilla 请求并将响应解析为 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);  
         
);

【讨论】:

感谢您的回答。我试过你的代码,但我忘了告诉你这是一个 json 控制器,所以我收到了这个错误TypeError: &lt;Response 4 bytes [500 INTERNAL SERVER ERROR]&gt; is not JSON serializable。再看看我的问题,我用控制器的更多行更新了它:) 我更新了我的帖子。虽然这是一个微不足道的例子,但这对我有用。 如果我这样做 Response.status = '400' 我在我的问题中写下界面中的错误。之后我无法在 Odoo 中执行任何操作,因为错误总是出现 “你不能在 odoo 中执行更多操作”是什么意思?我运行此命令没有任何错误。我可以毫无错误地发出请求并得到响应(使用终端)。 您的 odoo 服务器是否记录错误?还是您的浏览器显示错误?你试过我的确切例子吗?我在几分钟前使用了这个,没有错误,我正在打印信息级别的日志记录。

以上是关于如何在 Odoo JSON 控制器中发送简单的消息和状态作为响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Odoo 中的 Web 控制器调用 json 数据

Odoo:如何在向表单“添加新行”后发送 message_post()

使用 laravel 上的路由发送 json 消息

显示如何从控制台应用程序发送 Lync 消息的简单示例/教程

如何从 Java 对象向客户端发送 spring 消息

如何从 JSON 文件中向用户发送消息?