假设我有一个由Thingy和Dooda组成的Widget资源。 Thingys和Doodas有各种类型,Thingy类型和Dooda类型的组合将确定Widget将具有哪些属性。 虽然我明白为了创建一个Widget,我应该发送一个完整的资源表示,Thingys和Doodas的潜在组合很多,所以在一个Widget对象中发送所有可能的属性是不切实际的。
因此,为了创建一个Widget,我只需要发送由Thingy和Dooda组合定义的属性。 向客户端传达要发送的表示的定义的最佳方法是什么?
我的第一个想法是提供一个端点,客户端可以向其发送Thingy / Dooda类型组合并接收Widget的空白“模板”表示,该表示定义了所需的属性,或者是否有更好的方法来处理这种情况?
答案 0 :(得分:2)
这是一种方式
> GET http://acme.com/api
< 200 OK
< Content-type: application/hal+xml
<resource>
<!-- Home resource for acme API -->
<link rel="create-form" href="http://acme.com/api/widgets/form{?thingyType,doodaType}"
</resource>
Hal是一种标准的超媒体格式here。
create-form
链接关系类型在RFC 6861中定义。
URI使用RFC 6570中定义的URI模板格式。
客户端必须解析URI模板并遵循create-form
的规则来检索表单表示。
> GET /acme.com/api/widget?thingyType=foo&doodaType=bar
< 200 OK
< Content-Type: application/xhtml
<html>
<form method="POST"href="http://acme.com/api/widgets">
<input type="text" name="thingyX">
<input type="text" name="thingyY">
<input type="text" name="doodaA">
<input type="text" name="doodaB">
</form>
</html>
在这个例子中,我使用了一个html表单。但是,不要求使用这种形式。可以使用其他一些表单类型的媒体类型。
> POST http://acme.com/api/widgets
> Content-Type: x-application/www-form-urlencoded
thingyX=20&thingyY=45&doodaA=yo&doodaB=dawg
< 201 Created
< Location: http://acme.com/api/widgets/975
创建窗口小部件后,可以使用您喜欢的任何表示媒体类型检索它。
> GET http://acme.com/api/widgets/975
< 200 OK
< Content-Type: application/vnd.acme.widget+xml
<widget>
<thingy X="20" Y="45">
<dooda A="yo" B="dawg"/>
</widget>