如何进行REST-ful更新?

nec*_*cer 7 rest

如果我有一个对象,比如说Employee,我想提供两种不同的更新方式 - 更新性能评级或更新联系信息.

什么是构建API的REST-ful方式?我假设正确的方法是POST.

我担心的是,对于用户来说,首先获取对象的两个部分(性能评级和联系信息),仅更新一个部分以及POST整个更新的对象似乎是不优雅的.

另一个问题是发送一个只填充了某些字段的对象似乎不太优雅,因为对象的模式要求所有字段都完整,而省略字段只是为了支持POST.I. e.它需要单独的模式来支持操作或没有模式 - 似乎都没有.

同样,使用标志来更新哪些字段也需要一个不同的模式来执行操作.

提供单独的方法并不适合任何明显的方式进入名词 - 动词范式.

如果需要处理此类案例,REST API应该如何显示?REST名词和应用程序实体之间是否需要多对一映射?如果是这样,我们是否为表示应用程序实体子集的视图实体限制PUT?

我不是在寻找黑客或不优雅的方式.我正在寻找REST理念认为正确的解决方案.提前致谢!

sup*_*opi 4

我不确定这是否会消除您的担忧,但是看到评级和信息也是资源,我会制作这样的 API(感谢 taylonr 提供的模板:)

url/employees/{id}/[rating|info]
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获取所有员工的代表、具有特定 ID 的员工、具有特定 ID 的员工的绩效评级以及具有特定 ID 的员工的联系信息。

使用初始化的联系信息和绩效评级创建新员工

POST url/employees { "id": "johnsmith", "rating": 4, "info": ["address": "street 1 a 1" , "email": "johns.old@mail.com"] }
Run Code Online (Sandbox Code Playgroud)

更新 2 将适用于不同的 POST

PUT url/employees/johnsmith/rating  { "rating": 5 }
PUT url/employees/johnsmith/info { "email": "john.smith@company.com" }
Run Code Online (Sandbox Code Playgroud)

  • 我建议在这里颠倒PUT和POST;POST 到 url/employees,让服务器创建 url/employess/johnsmith,或者如果您已经知道这是该资源的 URI,则 PUT 到 url/employees/johnsmith。并且 PUT 到 url/employees/johnsmith/ rating 和 /info,因为您知道这些资源的完整 URI。 (3认同)