我是REST新手,但我已经构建了一个简单的Web服务,而且我很难找到一个简单的解释,说明哪种URL格式是正确的。
该服务允许创建发票并将其推送到一系列简单的审批阶段。
(1)以XML格式阅读所有发票:
GET: http://localhost/webapp/ws/invoices
(2)以XML格式阅读一张发票(例如发票ID = 555):
GET: http://localhost/webapp/ws/invoices/555
(3)提交新发票:
POST: http://localhost/webapp/ws/invoices
包含发票属性(“userid”,“totalprice”等),就像简单HTML表单的POST参数一样。
(4)批准发票:
POST: http://localhost/webapp/ws/invoices/action
包含动作属性(例如“userid = 123”,invoiceid = 567,“action = APPROVE”或“REJECT”等),就像简单HTML表单的POST参数一样。
它工作正常,但是它甚至接近RESTful Web服务应该是什么样子?
非常感谢任何建议,谢谢。
罗布
答案 0 :(得分:3)
URL不会使API RESTful。更重要的是清楚地表示您的资源及其状态转换(通过链接和表单),并避免将客户端与您的实现联系起来的带外信息。 A RESTful Hypermedia API in Three Easy Steps covers这个概念很好。
1)创建一个根资源,为所有客户端提供一个众所周知的起点,并允许他们发现可用的服务(这可以是Browers使用的相同URL。使用Accept
标头确定是否HTML或者应该返回您的API媒体类型。
<webapp href="/webapp">
<invoices href="/webapp/invoices"/>
... any other services ...
</webapp>
2)为您的发票创建收集资源
获取:http://localhost/webapp/invoices
<invoices href="/webapp/invoices">
<invoice href="/webapp/invoices/555"/>
<invoice href="/webapp/invoices/554"/>
<invoice href="/webapp/invoices/553"/>
<invoice href="/webapp/invoices/552"/>
...
<search href="/webapp/invoices/" method="get">
<query type="xpath" cardinality="required"/>
</search>
<next href="/webapp/invoices?page=2" method="get"/>
<create-draft href="/webapp/invoices" method="post">
<total-price type="decimal" cardinality="optional"/>
... user should be picked up automatically based on the authorised user posting the form ...
... add other optional and required parameters here. ...
</create-draft>
</invoices>
这是一个分页集合,next
元素告诉客户端如何获取下一页。如果没有足够的发票(例如,5个发票,每个页面可以包含10个),则不会显示next
元素。同样,如果请求者无权创建发票,则不会包含create-draft
表单。
获取下一页看起来像:
获取:http://localhost/webapp/invoices?page=2
<invoices href="/webapp/invoices">
<invoice href="/webapp/invoices/545"/>
<invoice href="/webapp/invoices/544"/>
<invoice href="/webapp/invoices/543"/>
<invoice href="/webapp/invoices/542"/>
...
<search href="/webapp/invoices/" method="get">
<query type="xpath" cardinality="required"/>
</search>
<next href="/webapp/invoices?page=3" method="get"/>
<prev href="/webapp/invoices" method="get"/>
<create-draft href="/webapp/invoices" method="post">
<total-price type="xs:decimal" cardinality="optional"/>
... user should be picked up automatically based on the authorised user posting the form ...
... add other optional and required parameters here. ...
</create-draft>
</invoices>
3)为您的发票创建项目资源
获取:http://localhost/webapp/invoices/555
<invoice href="/webapp/invoice/555">
... details go here ...
<reject href="/webapp/invoices/555" method="delete">
<reason type="xs:string" cardinality="required"/>
</reject>
<approve href="/webapp/invoices/555" method="put">
... add approval parameters here ...
</approve>
</invoices>
同样,如果用户无权拒绝或批准发票,则不应显示这些元素。如果发票已经批准(在这种情况下可能有取消表格),也是如此。
答案 1 :(得分:1)
恕我直言,我会做批准程序:
(4)批准发票:
PUT: http://localhost/webapp/ws/invoices/555
当您要修改由ID(555)标识的现有资源时,您只需要传递将要更改的属性。