jhhb/webservices

一个模块,通过Web端点以Web服务的形式暴露SilverStripe服务类。

安装: 29

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:silverstripe-module

dev-master 2022-08-29 14:07 UTC

This package is auto-updated.

Last update: 2024-09-29 05:57:13 UTC


README

一个模块,用于通过URL以Web可消费的格式暴露定义的业务逻辑,并通过令牌访问提供对这些Web服务的访问。

这些服务严格来说不是REST服务,因为单个URL不是为了通过GET和POST访问;它是在HTTP上的RPC。

维护者联系方式

版本

此模块的主分支目前旨在与SilverStripe 3.1兼容

需求

  • SilverStripe 4+

安装

文档

webservices模块将自动将基于URL的请求从URL + 参数转换为系统服务的方法和变量,然后将响应自动转换为Web可访问的格式(支持JSON和XML,尽管XML尚未完成)。其目标之一是鼓励在SilverStripe项目中采用面向服务的架构,以便将业务逻辑封装在远离控制器的层中(这是一个普遍存在的问题)。

URL分解如下

(type)/(service)/(method)?(paramName)=(value)&token=(token)[&SecurityID=(securityID)]
  • type:jsonservice或webservice,表示所需的输出格式
  • service:服务类的名称(见下文)。它期望服务以字符串'服务'结尾 - 实际上,这将被自动附加到传递给这里的名称。
  • method:要调用的服务方法名称
  • paramName/value:表示参数的键/值对。paramName必须与方法声明中的参数名称匹配。
    • 有关如何传递DataObjects的信息,请参阅下面的注释
  • token | SecurityID:每个请求都必须经过验证;这可以通过使用令牌参数(与用户的API令牌相匹配)或通过传递已登录用户的安全ID来完成。可以在CMS的用户详细信息标签中找到令牌

包含一个示例服务,用于使用event_calendar模块创建日历事件。您可以使用以下curl语句创建此事件

curl -X POST -d "token={your token here}&parentCalendar={ID of calendar}&title=My new event&content=This is an event on a day here and now&startDate=2012-04-21" http://{your site url}/jsonservice/calendarweb/createEvent

传递DataObjects

在某些情况下,您可能希望将数据对象传递给服务方法。为了允许从URL参数传递,您可以选择传递ID和Type参数,这些参数将被转换为适当的用途。例如,此方法签名

public function myMethod(DataObject $page) {

}

可以通过以下方式访问

jsonservice/Service/myMethod?pageID=1&pageType=Page

模块将负责将其转换为相关对象类型

允许访问服务和其方法

为了能够在服务上调用方法,服务必须标记为可访问 - 这可以通过两种方式之一来完成

  • 实现WebServiceable接口
  • 实现webEnabledMethods方法,该方法返回一个包含方法名称和它们支持请求类型(目前仅支持GET或POST)的映射。请注意,为了执行用户级访问控制,您应该在方法中直接执行检查,或者将用户检查逻辑包装在此方法生成的数组周围。

因此,默认情况下,无法任意调用任何服务。此外,webEnabledMethods 调用并不使用 SilverStripe 的 hasMethod 构造(因为预计服务不需要继承自 'Object' 而承担额外开销),因此目前无法通过扩展进行重写。将来将会有方法通过扩展来更新这一点。

通过 URL 传递参数

Web服务控制器支持通过 URL 传递参数/值对。例如,以下请求将提取参数

/jsonservice/my/method/name/something/id/2

将调用 My::method(),并传递以下参数:

  • name = something
  • id = 2

文件上传

文件可以作为多部分上传处理,或者通过将原始文件发布到 Web 服务,通常与上述 URL 参数一起使用。

要使文件可供您的服务方法使用,您必须有一个名为 "file" 的方法参数和一个 POST 请求类型;请求的原始 POST 主体将被放置在 "file" 变量中,并且任何在 URL 上找到的参数也将传递。

例如,在您的服务中

public function method($file, $name) {

}

发送一个如下所示的 POST 请求

curl -X POST -d @somefile.jpg http://site/jsonservice/my/method/name/myfile.jpg

将把 somefile.jpg 的主体发送到 $file 变量中,并且 $name == 'myfile.jpg'

发送 POST 主体

您可以通过将所有方法参数放入 JSON 对象中,并将其作为 POST 请求的主体来传递参数,而不是通过 URL 传递参数。例如,以下 JSON 数据

{
    "parentCalendar": "2",
    "title": "This is a calendar event" 
}

将传递两个字段作为 URL 中命名的任何方法的参数。重要的是您必须发送 Content-Type: application/json 头部。

令牌

认证令牌可以通过 URL 中的 token GET 参数传递,或者通过在请求中包含 X-Auth-Token 头部传递。

模块将自动向用户对象添加一个 'Token' 字段,并在创建用户账户时生成一个随机令牌。这可以用于在不首先登录的情况下访问 API。

否则,如果用户已登录,他们可以通过请求将安全令牌作为参数(默认情况下为 SecurityID)传递,这将授予用户访问权限。这可以通过设置 WebserviceAuthenticator 的 allowPublicAccess 参数来禁用。

Injector:
  WebserviceAuthenticator:
    properties:
      allowPublicAccess: 0