jhhb / webservices
一个模块,通过Web端点以Web服务的形式暴露SilverStripe服务类。
This package is auto-updated.
Last update: 2024-09-29 05:57:13 UTC
README
一个模块,用于通过URL以Web可消费的格式暴露定义的业务逻辑,并通过令牌访问提供对这些Web服务的访问。
这些服务严格来说不是REST服务,因为单个URL不是为了通过GET和POST访问;它是在HTTP上的RPC。
维护者联系方式
- Marcus Nyeholt marcus@silverstripe.com.au
版本
此模块的主分支目前旨在与SilverStripe 3.1兼容
需求
- SilverStripe 4+
安装
-
将此目录放置在您的SilverStripe安装根目录下。
-
运行dev/build
-
创建您的服务类,这将通过控制器代码和直接通过Web进行访问
-
通过适当的URL访问您的服务,例如
http://yourUrl/jsonservice/DummyWeb/myMethod?param=stuff&SecurityID=security_id_here
-
使用响应
文档
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