Web services 以json形式从odoo 9返回数据

Web services 以json形式从odoo 9返回数据,web-services,openerp,odoo-9,json-rpc,odoo-10,Web Services,Openerp,Odoo 9,Json Rpc,Odoo 10,我想从odoo controllery.py获取JSON格式的数据 例如: 将openerp.http导入为http 从openerp.http导入请求 类MyController(http.Controller): @http.route('/test_html',type=“http”,auth=“public”) 定义一些html(自我): 返回“测试” #打开时工作正常http://localhost:8069/test.html @http.route('/test_json',typ

我想从odoo controllery.py获取JSON格式的数据

例如:

将openerp.http导入为http
从openerp.http导入请求
类MyController(http.Controller):
@http.route('/test_html',type=“http”,auth=“public”)
定义一些html(自我):
返回“测试”
#打开时工作正常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后查看json???

重要的部分是正确定义请求的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'
请求错误
,/test_json:Function声明为能够处理'json'类型的请求,但使用'http'类型的请求调用

如果您真的希望能够在浏览器中查看控制器并发出json请求,那么您可以使用控制器做一些非常奇妙的事情。不过,我会发布第二个问题

重要的部分是正确定义请求的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'
请求错误
,/test_json:Function声明为能够处理'json'类型的请求,但使用'http'类型的请求调用

如果您真的希望能够在浏览器中查看控制器并发出json请求,那么您可以使用控制器做一些非常奇妙的事情。不过,我会发布第二个问题

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

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

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

curl'http://localhost:8069/test_json'-H'内容类型:application/json'--数据“{}”
--data“{}”
这里表示一个空的JSON结构,它将作为请求参数传递给您的端点


请注意,如果您使用的是多个Odoo数据库,您可能还需要传递一个包含您的
会话\u id
cookie的附加头。

您的控制器端点看起来正常,应该正常工作,因此我想您的主要问题是如何测试它

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

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

curl'http://localhost:8069/test_json'-H'内容类型:application/json'--数据“{}”
--data“{}”
这里表示一个空的JSON结构,它将作为请求参数传递给您的端点


请注意,如果您使用的是多个Odoo数据库,您可能还需要传递一个包含您的
会话\u id
cookie的附加标题。

Wow,我们的回答实际上完全相同。@Naglis Jonaitas Tnx要获得帮助,是否有来自Odoo的在线json?Wow,我们的回答几乎完全相同。@Naglis Jonaitas Tnx需要帮助,是不是在线上可以从odoo获得类似的json?@Philip Stack Tnx例如,现在有任何简单的例子如何用我的数据库表(res.users)中的记录替换return json.dumps({“name”:“odoo”,“website”:“www.123.com”)。要访问记录,请使用当前用户的
http.request.env.user'。要指定不同的用户
http.request.env['res.users'].sudo().browse([user_id]),您可以将其构建到响应变量中。您好Phillip,这是我调用get resonse 200后的示例,问题在哪里?如何从控制器查看数据?我将更新我的答案。这实际上取决于您是从浏览器(javascript)还是其他服务器端语言请求数据。@例如,Philip Stack Tnx,现在有任何简单的示例可以说明如何用我的数据库表(res.users)中的记录替换返回json.dumps({“name”:“Odoo”,“website”:“www.123.com”)。要访问记录,请使用当前用户的
http.request.env.user'。要指定不同的用户
http.request.env['res.users'].sudo().browse([user_id]),您可以将其构建到响应变量中。您好Phillip,这是我调用get resonse 200后的示例,问题在哪里?如何从控制器查看数据?我将更新我的答案。这实际上取决于您是从浏览器(javascript)还是其他服务器端语言请求数据。