跳转到主要内容

借助这个插件,您可以开发自己的高级REST API,用于Odoo。

项目描述

Beta License: LGPL-3 OCA/rest-framework Translate me on Weblate Try me on Runbot

此插件提供开发Odoo高级REST API的基础。

随着Odoo成为企业IT系统的核心组成部分之一,通常需要设置专门的服务接口,以便现有系统可以与Odoo交互。

尽管在这种情况下Odoo的XML-RPC接口很有用,但它需要深入了解Odoo的内部数据模型。当广泛使用时,它会在Odoo内部和客户端系统之间创建强耦合,从而增加维护成本。

目录

配置

如果在调用服务方法(例如缺少参数)时发生错误,则系统仅返回问题的通用描述,而不提供详细信息。这样做是为了确保最大限度的实现细节透明度,从而降低安全风险。

当外部系统在开发中访问服务时,这种限制可能会引起问题。要了解错误的详细信息,确实需要访问服务器的日志。并不总是可以提供此类访问。因此,您可以将服务器配置为以开发模式运行这些服务。

要在开发模式下运行REST API,您必须在服务器配置文件中添加一个新的部分“[base_rest]”,并设置选项“dev_mode=True”。

[base_rest]
dev_mode=True

当REST API以开发模式运行时,在发生错误的情况下,将返回原始描述和堆栈跟踪。请注意,不要在生产环境中使用此模式

用法

要添加自己的REST服务,您必须提供至少2个类。

  • 提供您服务业务逻辑的组件,

  • 一个用于注册您服务的控制器。

您服务的业务逻辑必须实现到一个继承自(odoo.addons.component.core.Component)的组件中,该组件继承自“base.rest.service”

from odoo.addons.component.core import Component


class PingService(Component):
    _inherit = 'base.rest.service'
    _name = 'ping.service'
    _usage = 'ping'
    _collection = 'my_module.services'


    # The following method are 'public' and can be called from the controller.
    def get(self, _id, message):
        return {
            'response': 'Get called with message ' + message}

    def search(self, message):
        return {
            'response': 'Search called search with message ' + message}

    def update(self, _id, message):
        return {'response': 'PUT called with message ' + message}

    # pylint:disable=method-required-super
    def create(self, **params):
        return {'response': 'POST called with message ' + params['message']}

    def delete(self, _id):
        return {'response': 'DELETE called with id %s ' % _id}

    # Validator
    def _validator_search(self):
        return {'message': {'type': 'string'}}

    # Validator
    def _validator_get(self):
        # no parameters by default
        return {}

    def _validator_update(self):
        return {'message': {'type': 'string'}}

    def _validator_create(self):
        return {'message': {'type': 'string'}}

一旦您实现了服务(ping等),您必须告诉Odoo如何访问这些服务。此过程通过实现一个继承自(odoo.addons.base_rest.controllers.main.RestController)的控制器来完成。

from odoo.addons.base_rest.controllers import main

class MyRestController(main.RestController):
    _root_path = '/my_services_api/'
    _collection_name = my_module.services

在您的控制器中,使用_‘root_path’来指定访问您服务的路径的根,而‘_collection_name’是提供请求服务业务逻辑的集合的名称。

通过继承自(RestController),将注册以下路由来访问您的服务

@route([
    ROOT_PATH + '<string:_service_name>',
    ROOT_PATH + '<string:_service_name>/search',
    ROOT_PATH + '<string:_service_name>/<int:_id>',
    ROOT_PATH + '<string:_service_name>/<int:_id>/get'
], methods=['GET'], auth="user", csrf=False)
def get(self, _service_name, _id=None, **params):
    method_name = 'get' if _id else 'search'
    return self._process_method(_service_name, method_name, _id, params)

@route([
    ROOT_PATH + '<string:_service_name>',
    ROOT_PATH + '<string:_service_name>/<string:method_name>',
    ROOT_PATH + '<string:_service_name>/<int:_id>',
    ROOT_PATH + '<string:_service_name>/<int:_id>/<string:method_name>'
], methods=['POST'], auth="user", csrf=False)
def modify(self, _service_name, _id=None, method_name=None, **params):
    if not method_name:
        method_name = 'update' if _id else 'create'
    if method_name == 'get':
        _logger.error("HTTP POST with method name 'get' is not allowed. "
                      "(service name: %s)", _service_name)
        raise BadRequest()
    return self._process_method(_service_name, method_name, _id, params)

@route([
    ROOT_PATH + '<string:_service_name>/<int:_id>',
], methods=['PUT'], auth="user", csrf=False)
def update(self, _service_name, _id, **params):
    return self._process_method(_service_name, 'update', _id, params)

@route([
    ROOT_PATH + '<string:_service_name>/<int:_id>',
], methods=['DELETE'], auth="user", csrf=False)
def delete(self, _service_name, _id):
    return self._process_method(_service_name, 'delete', _id)

HTTP GET ‘http://my_odoo/my_services_api/ping’ 将被分配到 PingService.search 方法

已知问题/路线图

在GitHub上可以找到路线图已知问题

变更日志

12.0.2.0.1

  • _validator_…()方法现在可以返回一个cerberus Validator对象,而不是模式字典,以提供额外的灵活性(例如,允许验证器选项如allow_unknown)。

11.0.2.0.0

  • 许可证从AGPL-3更改为LGPL-3

11.0.1.0.1

  • 修复了在未提供REST API中某个方法的部分文档时渲染jsonapi文档的问题。

11.0.1.0.0

第一个官方版本。该插件已孵化到Akretion的Shopinvader仓库。有关更多信息,请查看git日志。

错误跟踪器

错误在GitHub Issues上跟踪。如果遇到问题,请检查您的错误是否已被报告。如果您是第一个发现它的人,请帮助我们通过提供详细且受欢迎的反馈

请不要直接联系贡献者以寻求支持或帮助解决技术问题。

致谢

作者

  • ACSONE SA/NV

贡献者

维护者

此模块由OCA维护。

Odoo Community Association

OCA,或Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛使用。

当前 维护者

lmignon

此模块是GitHub上的OCA/rest-framework项目的组成部分。

欢迎您贡献力量。有关如何贡献的更多信息,请访问https://odoo-community.org/page/Contribute

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

此版本没有可用的源代码分发文件。请参阅生成分发存档的教程

构建分发

odoo11_addon_base_rest-11.0.2.0.3-py2.py3-none-any.whl (2.8 MB 查看哈希值)

上传时间 Python 2 Python 3

支持