我正在设计一个RESTfull系统,网站使用该系统提交申请表,然后由内部工具用来授权或拒绝该应用程序。我在围绕如何构建这个问题进行辩论并有两个选择。 PUT或POST。
PUT选项
应用程序全部列在应用程序资源下,可以使用查询参数(通过不同资源公开的状态)通过状态代码(新的,已批准的,已拒绝的)进行过滤。可以将新应用程序发布到此URL,以创建它们并分配和ID。然后,您可以使用其ID访问GET应用程序。要批准,请将其中一个状态代码输入应用程序URL以更新记录。
GET Service.svc/statecodes
GET POST Service.svc/Applications?statecode={statecode} /{POST DATA}
GET PUT Service.svc/Applications/{applicationId} statecode={statecode}
POST OPTION
应用程序全部列在应用程序资源下,新的Applicatons可以发布到此URL,创建它们并分配和ID。有不同的网址显示应用程序的过滤视图:待处理,已批准,已拒绝。要批准applicationId,会将其发布到已批准的网址,并拒绝将该网址发布到已拒绝的网址。最后两个帖子会产生效果,或者将申请从待处理列表移动到批准的列表中。
POST Service.svc/Applications form={POST DATA}
GET Service.svc/Applications/{applicationId}
GET Service.svc/Applications/pending
GET POST Service.svc/Applications/approved applicationId={applicationId}
GET POST Service.svc/Applications/declined applicationId={applicationId}
PUT方法对我来说似乎是最RESTful的,但是暴露了外部世界的行为并破坏了封装。 POST方法看起来更干净,更容易发现,但我不喜欢POST对另一个资源上的资源的副作用。
我觉得实际上我们应该使用SOAP进行批准和拒绝,因为它是一个命令/消息,而不是一个查询,这实际上是REST的全部内容,但是我被困在一条从高处开始的路径,除非有人可以帮助我形成SOAP的论据。
那么哪种方法是最佳方法?
答案 0 :(得分:1)
获取/设置应用state
:
GET PUT /application/{id}/state
如果它不是公共接口,那么如果请求不是来自内部工具,则可以返回403(如果可以获得获取/设置状态的授权,则返回401)。
提交新申请并查看:
POST /application/
GET /application/{id}
您还可以公开具有特定状态的所有应用程序:
GET /application?state={pending|approved|declined}
如果你想要一个状态为pending
的应用程序集合,那么相同的资源可能有多个网址:
/state/pending/application
和
/application?state=pending
帮助我形成SOAP的论据。
有关讨论如何进行的示例,请参阅Should a Netflix or Twitter-style web service use REST or SOAP?。