【问题标题】:Return data as json from odoo 9从odoo 9以json形式返回数据
【发布时间】:2017-02-17 14:25:57
【问题描述】:

我想从 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 的数据。

打开urlhttp://localhost:8069/test_json后可以查看json吗???

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • @Philip Stack Tnx 例如,现在任何简单的示例如何将 return json.dumps({"name": "Odoo", 'website': 'www.123.com'}) 替换为记录来自我的数据库表(res.users)。
    • 要访问记录,您可以使用http.request.env.user' which would be the current user. To specify a different user http.request.env['res.users'].sudo().browse([user_id])` 从那里将其构建到响应变量中.
    • 您好 Phillip,这是我的示例 postimg.org/image/sa4q1miur 在调用 get resonse 200 后,问题出在哪里?
    • 如何从控制器查看数据?
    • 我会更新我的答案。这真的取决于您是从浏览器(javascript)还是其他服务器端语言请求数据。
    【解决方案2】:

    你的控制器端点看起来没问题,应该可以正常工作,所以我猜你的主要问题是如何测试它。

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

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

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

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

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

    【讨论】:

    • 哇,我们的回答真的完全一样。
    • @Naglis Jonaitas Tnx 寻求帮助,是否有任何在线可用的 json 来自 odoo 之类的 odoo.com/simple_json
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多