0

我想从 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 格式的数据,我希望使用 ajax 在其他应用程序中读取来自 json 的数据。

打开 url http://localhost:8069/test_json后是否可以查看 json ???

4

2 回答 2

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 请求,您可能可以用控制器做一些非常漂亮的事情。我会发布第二个问题。

于 2017-02-17T15:38:37.797 回答
0

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

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

或者,您可以使用以下工具从命令行测试您的 API curl

curl 'http://localhost:8069/test_json' -H 'Content-Type: application/json' --data "{}"

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

session_id请注意,如果您使用多个 Odoo 数据库,您可能还需要传递一个包含 cookie 的附加标头

于 2017-02-17T15:45:36.743 回答