我正在构建库存管理系统,而且我正在忙于设计(思考)API和我的REST实现。
我有以下资源,您可以在资源上执行许多操作/操作。 每个操作都将修改资源,并在某些情况下创建新资源并创建历史记录或事务。
我正在寻找专家关于URL和资源设计的可用性和可接受性的一些意见。陷阱和现实世界的例子,任何意见或批评欢迎。
我担心整个应用程序可能围绕这一大资源开发? 我的后端堆栈将是C#和servicestack框架,对于前端,我将使用HTML和AngularJS。并不是说它有所作为。
情景1。 典型的操作是:
POST /inventory/{id}/move
POST /inventory/{id}/scrap
PUT /inventory/{id}/takeon
POST /inventory/{id}/pick
PUT /inventory/{id}/receive
POST /inventory/{id}/hold
POST /inventory/{id}/release
POST /inventory/{id}/transfer
POST /inventory/{id}/return
POST /inventory/{id}/adjustment
{
"userID": "", //who is doing the actions (all)
"tolocationID": "", //new location for inventory (move/takeon/pick/receive/transfer/return)
"qty": "", //qty (pick/receive/takeon/transfer/return)
"comment": "", //optional for transaction (all)
"serial": "", //(takeon/receive)
"batch": "", //(takeon/receive)
"expirydate": "", //(takeon/receive)
"itemCode": "", //(takeon/receive)
"documentID": "", //(pick/receive/return/transfer)
"reference" :"", //(all)
"UOM" :"", //(all)
"reference" :"", //(all)
}
这是否可以接受标准。 另一种方法可能是。
情景2。
POST /inventory/{id}/move
POST /inventory/{id}/scrap
PUT /inventory/{id}/takeon
POST /document/{id}/pick //**document**
PUT /document/{id}/receive //**document**
POST /inventory/{id}/hold
POST /inventory/{id}/release
POST /document/{id}/transfer //**document**
POST /document/{id}/return //**document**
POST /inventory/{id}/adjustment
然后更改资源。
场景3.在我看来错了
POST /transaction/move/{...}
POST /transaction/scrap/{...}
PUT /transaction/takeon/{...}
POST /transaction/pick/{...}
PUT /transaction/receive/{...}
POST /transaction/hold/{...}
POST /transaction/release/{...}
POST /transaction/transfer/{...}
POST /transaction/return/{...}
POST /transaction/adjustment/{...}
欢迎提出任何意见,不是寻求答案,而是提出有关设计考虑的更多建议?
感谢您花时间阅读此条目!
答案 0 :(得分:40)
我有以下资源,您可以在资源上执行 许多行动/行动。每个操作都将修改资源和 在某些情况下,创建一个新资源,也创建历史或 交易。
REST架构架构的基础是使用HTTP谓词作为唯一的动词,并且不包括URL中的动词。在你的鞋子里,我会考虑重新修改你的系统以删除动词。如果没有真正知道任何动词的含义,很难提出一个设计,但也许更接近于:
GET /inventory/{id}
PUT /inventory/{id} -- update with new location
PUT /inventory/{id} -- update with new status (scrapped)
等等。这是一种更加RESTful的方法。其中许多操作看起来都像PUT那样更新了资源的多个属性,例如位置,数量,注释字段等。也许scrap
是DELETE?很难说。
另一个选择是使用POST,其中正文包含有关如何操作库存项目的说明:
POST /inventory-transactions/{id}
{
"action": "takeon",
"newLocationId": 12345,
...
}
这为您提供了大量可追溯性,因为现在可以将每个操作作为资源进行跟踪。在端点周围存在很多复杂性。
您还可以将一些“动词”操作分解为资源:
POST /returned-inventory
{
"inventoryId": 12345,
"documentId": 67890,
"comment": "Busted up",
...
}
这使您可以根据状态轻松查看库存项目,这可能会有所帮助,也可能没有帮助。例如,您可以调用GET /returned-inventory?documentId=67890
从同一文档中取回所有返回的项目。
希望那里有一些值得思考的东西。如果不更详细地了解您的业务需求,任何人都无法告诉您“正确”的事情。
答案 1 :(得分:12)
" Restful Objects",定义RESTful API,声明操作有效。
可以发现,启用/禁用可用操作,并且可以提供已禁用的原因'反馈
行动被调用'使用GET(查询),PUT(幂等)或POST(非幂等)
Restful Object Spec(第C-125页)
答案 2 :(得分:0)
简短答案:
使用网址末尾的操作来更改状态。
Github这样做是为了激发要点 : PUT / gists /:gist_id / star
在这里解释 https://developer.github.com/v3/gists/#star-a-gist
长答案:
您的目标是使您的应用程序轻松使用直观。您的用户应以最简单的方式使用您的应用。您的用户不应受到所用技术的限制或严格指导。
因此,操作和操作本质上不是资源,而是对资源的操作。因此,他们不会像REST那样响应“资源到URI映射”。
但是您可以结合使用REST和URI的优点。
记住:
技术应该为您服务,而不是您为技术服务。
如果您成为技术的奴隶,您将最终创建无法使用的应用程序或使用诸如XML或Java Home and Remote接口之类的丑陋技术,因此最终需要编写5个文件来创建一个hello world应用程序。
注意“发光物体综合症”。谷歌一下。
不是因为一项技术是新技术还是“新的做事方式”,而是意味着这是一项好技术,否则您就需要分心,而抛开所有其他技术以屈服于REST。
从技术中获取所需的东西,然后使技术为您服务。
使用REST api并不意味着您需要放弃URL和URI技术的功能。
参考: https://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api#restful