我正在努力决定如何设计restful url。我完全赞成使用带有名词而不是动词的url的restful方法,我不知道如何做到这一点。
我们正在创建一个服务来实现一个金融计算器。计算器接受一堆参数,我们将通过CSV文件上传这些参数。用例包括:
上传新参数
获取最新参数
获取给定业务日期的参数
激活一组参数
验证一组参数
我收集的restful方法将有以下类型的url:
/parameters
/parameters/12-23-2009
你可以通过以下方法实现前三个用例:
在POST请求中包含参数文件
第一个URL的GET
第二个URL的GET
但是在没有动词的情况下如何完成第4和第5个用例呢?你不需要这样的url吗:
/parameters/ID/activate
/parameters/ID/validate
??
激活和验证需求是试图更改资源状态的情况。将一个订单“完成”或其他一些请求“提交”是没有区别的。有许多方法可以对这种状态变化建模,但我发现最有效的一种方法是为相同状态的资源创建集合资源,然后在集合之间移动资源以影响状态。
例如:创建一些资源,例如:
/ActiveParameters
/ValidatedParameters
如果要使一组参数处于活动状态,则将该集添加到ActiveParameters集合。您可以将参数集作为实体体传递,也可以将url作为查询参数传递,如下所示:
POST /ActiveParameters?parameter=/Parameters/{Id}
同样的事情也可以用/ValidatedParameters完成。如果参数无效,则服务器可以向请求返回“Bad Request”,将参数添加到已验证参数的集合中。
激活和验证需求是试图更改资源状态的情况。将一个订单“完成”或其他一些请求“提交”是没有区别的。有许多方法可以对这种状态变化建模,但我发现最有效的一种方法是为相同状态的资源创建集合资源,然后在集合之间移动资源以影响状态。
例如:创建一些资源,例如:
/ActiveParameters
/ValidatedParameters
如果要使一组参数处于活动状态,则将该集添加到ActiveParameters集合。您可以将参数集作为实体体传递,也可以将url作为查询参数传递,如下所示:
POST /ActiveParameters?parameter=/Parameters/{Id}
同样的事情也可以用/ValidatedParameters完成。如果参数无效,则服务器可以向请求返回“Bad Request”,将参数添加到已验证参数的集合中。
url的设计与应用程序是否是RESTful无关。因此,“RESTful url”这个短语是毫无意义的。
我认为你应该多读一些关于REST到底是什么的书。REST将url视为不透明的,因此不知道其中有什么,是否有动词或名词或其他什么。您可能仍然希望设计url,但这是关于UI,而不是REST。
也就是说,让我们来回答您的问题:最后两种情况不是RESTful的,不适合任何类型的RESTful方案。这些就是所谓的RPC。如果认真对待REST,就必须重新思考应用程序如何从头开始工作。要么放弃REST,把你的应用程序作为RPC应用程序。
嗯,也许不是。
这里的想法是,你必须把所有东西都当作资源,所以一旦一组参数有了一个URL,你可以引用它,你只需要添加:
GET [parametersurl]/validationresults
POST [paramatersurl]
body: {command:"activate"}
但是,那个激活的东西是RPC,不是REST。
In a REST environment, each URL is a unique resource. What are your resources? A financial calculator really doesn't have any obvious resources. You need to dig into what you are calling parameters and pull out the resources. For example, an amortization calendar for a loan might be a resource. The URL for the calendar might include start date, term (in months or years), period (when interest is compounded), interest rate, and initial principle. With all those values, you have a specific calendar of payments:
http://example.com/amort_cal/2009-10-20/30yrsfixed/monthly/5.00/200000
现在,我不知道你在计算什么,但你的参数列表的概念听起来不RESTful。正如其他人所说,上面的需求听起来更像是XMLRPC。如果你在尝试REST,你需要名词。计算不是名词,而是作用于名词的动词。你需要把它转过来,把名词从你的计算器中抽出来。
我建议使用以下Meta资源和方法。
使参数激活和/或验证它们:
> PUT /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Content-Type: application/json
> Connection: close
>
> {'active': true, 'require-valid': true}
>
< HTTP/1.1 200 OK
< Connection: close
<
检查参数是否激活且有效:
> GET /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Connection: close
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Connection: close
<
< {
< 'active': true,
< 'require-valid': true,
< 'valid': {'status': false, 'reason': '...'}
< }
<