从odoo 9返回数据为json

时间:2017-02-17 14:25:58

标签: web-services openerp odoo-9 json-rpc odoo-10

我想从odoo controllery.py

获取JSON格式的数据

示例:

import openerp.http as http
from openerp.http import request

class MyController(http.Controller):

    @http.route('/test_html', type="http", auth="public")
    def some_html(self):
        return "<h1>Test</h1>"

    #Work fine when open http://localhost:8069/test.html

    @http.route('/test_json', type="json", website=True, auth="public")
    def some_json(self):
        return [{"name": "Odoo", 'website': 'www.123.com'}]

如何以json格式获取数据,我希望json中的数据在其他应用程序中使用ajax读取。

是否可以在打开网址http://localhost:8069/test_json ???

后查看json

2 个答案:

答案 0 :(得分:2)

重要的是要正确定义请求的contentType。

import json

@http.route('/test_json', type="json", auth="public")
def some_json(self):
    return json.dumps({"name": "Odoo", 'website': 'www.123.com'})

在使用javascript的客户端中,您可以像这样请求json。

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

或者在python中使用请求

import requests,json

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

访问回复正文

body = res.text

至于你是否可以简单地打开浏览器并查看json。不,不是默认。

这是我得到的

Bad Request

<function some_json at 0x7f48386ceb90>, /test_json: Function declared as capable of handling request of type 'json' but called with a request of type 'http'

如果你真的希望能够在浏览器中查看它以及发出json请求,你可能会对控制器做一些非常喜欢的事情。我会发布第二个问题。

答案 1 :(得分:0)

你的控制器端点看起来不错,应该能正常运行,所以我想你的主要问题是如何测试它。

一旦声明端点类型为json,Odoo将检查请求内容类型标头实际上是否为JSON,因此为了测试它,您的请求需要设置Content-Type: application/json标头。使用常规浏览器有点困难,除非您在查询之前编辑请求标头或通过Ajax从JavaScript调用JSON端点。

或者,您可以使用curl

等工具从命令行测试API
curl 'http://localhost:8069/test_json' -H 'Content-Type: application/json' --data "{}"

--data "{}"这里表示一个空的JSON结构,它将作为请求参数传递给您的端点。

请注意,如果您使用的是多个Odoo数据库,则可能还需要传递包含session_id Cookie的其他标头。