对于这个简单的REST Web服务,我的URL应该是什么样的?

时间:2012-03-05 21:20:34

标签: rest

我是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服务应该是什么样子?

非常感谢任何建议,谢谢。

罗布

2 个答案:

答案 0 :(得分:3)

URL不会使API RESTful。更重要的是清楚地表示您的资源及其状态转换(通过链接和表单),并避免将客户端与您的实现联系起来的带外信息。 A RESTful Hypermedia API in Three Easy Steps covers这个概念很好。

1)创建一个根资源,为所有客户端提供一个众所周知的起点,并允许他们发现可用的服务(这可以是Browers使用的相同URL。使用Accept标头确定是否HTML或者应该返回您的API媒体类型。

获取:http://localhost/webapp

<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)标识的现有资源时,您只需要传递将要更改的属性。