创建可以具有多个表示的资源

时间:2013-06-04 12:15:47

标签: rest asp.net-web-api

假设我有一个由Thingy和Dooda组成的Widget资源。 Thingys和Doodas有各种类型,Thingy类型和Dooda类型的组合将确定Widget将具有哪些属性。 虽然我明白为了创建一个Widget,我应该发送一个完整的资源表示,Thingys和Doodas的潜在组合很多,所以在一个Widget对象中发送所有可能的属性是不切实际的。

因此,为了创建一个Widget,我只需要发送由Thingy和Dooda组合定义的属性。 向客户端传达要发送的表示的定义的最佳方法是什么?

我的第一个想法是提供一个端点,客户端可以向其发送Thingy / Dooda类型组合并接收Widget的空白“模板”表示,该表示定义了所需的属性,或者是否有更好的方法来处理这种情况?

1 个答案:

答案 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是一种标准的超媒体格式herecreate-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>