如何在获取端点 Odoo v11 中发送 json 作为响应
How to send json in response at Get Endpoint Odoo v11
目前正在尝试调用一个 odoo 控制器,其中 return 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>
在我的调用端点有 Request Header
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'
为你的路线。使用 type="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"})
作为对您问题的更新,我邀请您查看下面的 link,它处理的问题与您的问题相同:
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 方法,就像您已经对类型 'json' 所做的那样,在客户端请求服务器时也使用 '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())
检查此 url 以查看有关在 pyhton 中发出请求的新方法的更多详细信息:
http://docs.python-requests.org/en/master/user/quickstart/#more-complicated-post-requests
End of update
要替换您的请求的 header 类型:text/html 如果您想要 return 一个 HTMl 响应,否则该方法的响应类型必须是 'json'
@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 存储库中的示例:
https://github.com/odoo/odoo/blob/11.0/addons/calendar/controllers/main.py
日历主控的accept方法:
@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')
如果您查看此方法的 return,您会注意到它是一个视图(表单视图),因此响应类型为 http
在同一文件中,您会发现方法 notify_ack return 是一个 json 响应,因此类型设置为 'json'
@http.route('/calendar/notify_ack', type='json', auth="user")
def notify_ack(self, type=''):
return request.env['res.partner']._set_calendar_last_notif_ack()
是的。 ODOO HTTP GET 方法 100% 有效,请遵循我的指导。
控制器应该是 type='json',而不是 type='http'
"Hussain Ali" 在他的Qustation上绝对正确,作为我在下面为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.
此致,
光辉 - SnippetBucket.com
目前正在尝试调用一个 odoo 控制器,其中 return 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>
在我的调用端点有 Request Header
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'
为你的路线。使用 type="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"})
作为对您问题的更新,我邀请您查看下面的 link,它处理的问题与您的问题相同: 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 方法,就像您已经对类型 'json' 所做的那样,在客户端请求服务器时也使用 '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())
检查此 url 以查看有关在 pyhton 中发出请求的新方法的更多详细信息: http://docs.python-requests.org/en/master/user/quickstart/#more-complicated-post-requests
End of update
要替换您的请求的 header 类型:text/html 如果您想要 return 一个 HTMl 响应,否则该方法的响应类型必须是 'json'
@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 存储库中的示例: https://github.com/odoo/odoo/blob/11.0/addons/calendar/controllers/main.py
日历主控的accept方法:
@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')
如果您查看此方法的 return,您会注意到它是一个视图(表单视图),因此响应类型为 http
在同一文件中,您会发现方法 notify_ack return 是一个 json 响应,因此类型设置为 'json'
@http.route('/calendar/notify_ack', type='json', auth="user")
def notify_ack(self, type=''):
return request.env['res.partner']._set_calendar_last_notif_ack()
是的。 ODOO HTTP GET 方法 100% 有效,请遵循我的指导。
控制器应该是 type='json',而不是 type='http'
"Hussain Ali" 在他的Qustation上绝对正确,作为我在下面为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.
此致, 光辉 - SnippetBucket.com