如何在Get Endpoint Odoo v11发送响应中发送json

时间:2018-01-11 20:42:35

标签: python json controller odoo odoo-11

目前正在尝试调用odoo控制器,该控制器根据我的异常返回json数据。

@http.route('/web/update_order_webhook', type='http', csrf=False, auth="public")
def update_order_webhook(self, **kwargs):
    return Response(json.dumps({"yes":"i am json"}),content_type='application/json;charset=utf-8',status=200)

当我试图调用此终点时

import requests

url = "http://159.89.197.219:8069/web/update_order_webhook"

headers = {
    'content-type': "application/json"
    }

response = requests.request("GET", url, headers=headers)

print(response.text)

我收到请求正文

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>Invalid JSON data: ''</p>

在我的主叫终点处请求标题

content-length →137
content-type →text/html
date →Thu, 11 Jan 2018 20:32:53 GMT
server →Werkzeug/0.13 Python/3.5.2

这显然意味着我没有从我的odoo端点获取json响应数据。 根据上一个答案,我更新了我的代码

@http.route('/web/update_order_webhook', type='json', auth="public", website=True)
    def update_order_webhook(self, **kwargs):
         return json.dumps({"yes":"i am json"})

但是现在我在调用终端时遇到了新的错误

Bad Request
<function Binary.update_order_webhook at 0x7efd82ac8510>, /web/update_order_webhook: Function declared as capable of handling request of type 'json' but called with a request of type 'http'

3 个答案:

答案 0 :(得分:1)

作为对您问题的更新,我邀请您查看下面的链接,它会处理与您相同的问题: https://www.odoo.com/fr_FR/forum/aide-1/question/web-webclient-version-info-function-declared-as-capable-of-handling-request-of-type-json-but-called-with-a-request-of-type-http-100834

所以解决方法是设置python方法,因为你已经使用了类型&#39; json&#39;,在请求服务器时也使用了&#POST; POST方法,在客户端你需要发出GET请求并从json字段中获取结果。

python方法将是:

@http.route('/web/update_order_webhook',methods=['POST'], type='json', csrf=False, auth="public")
    def update_order_webhook(self, **kwargs):
        return Response(json.dumps({"yes":"i am json"}),content_type='application/json;charset=utf-8',status=200)

客户端将是:

import requests
url = "http://159.89.197.219:8069/web/update_order_webhook"
payload = {'key1':'val1','key2':'val2'}
response = requests.post(url, data=payload)
print(response.text)
print(response.json())

检查此网址以查看有关在pyhton中发出请求的新方法的更多详细信息: http://docs.python-requests.org/en/master/user/quickstart/#more-complicated-post-requests

  

更新结束

要替换请求的标题类型:text / html如果要返回HTMl响应,否则方法的响应类型必须为&#39; json&#39;

@http.route('/web/update_order_webhook', type='json', csrf=False, auth="public")
def update_order_webhook(self, **kwargs):
    return Response(json.dumps({"yes":"i am json"}),content_type='application/json;charset=utf-8',status=200)

另外从odoo github repo看一下这个例子: https://github.com/odoo/odoo/blob/11.0/addons/calendar/controllers/main.py

日历主控制器的接受方法:

@http.route('/calendar/meeting/accept', type='http', auth="calendar")
    def accept(self, db, token, action, id, **kwargs):
        registry = registry_get(db)
        with registry.cursor() as cr:
            env = Environment(cr, SUPERUSER_ID, {})
            attendee = env['calendar.attendee'].search([('access_token', '=', token), ('state', '!=', 'accepted')])
            if attendee:
                attendee.do_accept()
        return self.view(db, token, action, id, view='form')

如果您查看此方法的返回,您会注意到它是一个视图(表单视图),因此响应类型为http

在同一个文件中,您将找到返回json响应的方法notify_ack,以便将类型设置为&#39; json&#39;

@http.route('/calendar/notify_ack', type='json', auth="user")
    def notify_ack(self, type=''):
        return request.env['res.partner']._set_calendar_last_notif_ack()

答案 1 :(得分:0)

为您的路线。使用type =&#34; json&#34;标志。

@http.route('/web/update_order_webhook', type='json', auth="public", website=True)
def update_order_webhook(self, **kwargs):
    return json.dumps({"yes":"i am json"})

答案 2 :(得分:0)

是的。 ODOO HTTP GET方法可以100%工作,只需按照我的指导即可。

控制器应为type ='json',而不是type ='http'

“侯赛因·阿里”绝对正确,这是我在下面为ODOO编写的GET方法的解决方案

注意:我已经用示例代码为您提供了解决方案,您必须按照下面的说明纠正参数。

import requests

url = "https://dev-expert.snippetbucket.com/api/get_user_information/"


headers = {
    'content-type': "application/json",
    'user-token': "02BXD2AGqVH-TEJASTANK-gg92DwntD8f1p0tb",
    'cache-control': "no-cache",
    }
payload = "{\"params\": {}}"
response = requests.request("GET", url, data=payload, headers=headers)

print(response.text)

此解决方案绝对100%可用,只需data = payload即可添加,这也适用于odoo,最新版本为13.0。从版本14开始不发布,所以不能说。

解决方案也可以与odoo社区和企业版一起使用。

特别说明: 后面看到的故事,控制器中的odoo type ='json'并不意味着http json请求。 type ='json'其json-rpc。

关于, Tejas-SnippetBucket.com