我想在Odoo中接受并响应来自可能超出我控制的源的JSON请求。这不是直接的原因是因为Odoo强迫我使用JSON-RPC,它不适合我正在交互的源。
例如,如果我在@http.route
装饰器中设置路由类型为http
,如果mime类型为application/json
但正文没有内容,Odoo将拒绝请求。这在我的情况下不起作用,因为我可能无法选择其他源发送给我的内容。此外,除非传入请求不具有application/json
mime类型,否则我无法发送回自定义JSON响应,这再次不在我的控制范围内。
我在互联网上做了很多搜索,并阅读了很多Odoo的HTTP源代码。"solution"我一直看到到处都是猴子补丁JsonRequest
类这样或那样的方式。这允许我确实响应任何我想要的,但是它不允许我接受任何服务可能发送给我的。
一个特定的情况下,我需要能够处理的是传入的application/json
GET请求没有身体。尽管Odoo的JSON-RPC处理很繁重,但我如何实现这一点?
没有正确的方法来完成这一点,我认为所描述的方法是可接受的。它适用于Odoo 10到15的版本。
在我看来,最好离开JsonRequest类,让它做它的JSON-RPC相关的工作。有ooo .http. root。Get_request方法,根据内容类型构造json-rpc或HTTP请求对象:
class Root(object):
"""Root WSGI application for the OpenERP Web Client.
"""
# ...
def get_request(self, httprequest):
# deduce type of request
if httprequest.mimetype in ("application/json", "application/json-rpc"):
return JsonRequest(httprequest)
else:
return HttpRequest(httprequest)
这一点似乎是需要修补的最相关的一点,从该方法返回自定义请求类对象。但是有一个问题——这个方法是在任何路由检测之前调用的。你必须发明一个合适的方法来判断返回哪个请求类对象。
有一个关于可能实现的想法,请参阅OCA base_rest模块。