如何处理"改变原因"在PUT请求?

时间:2016-05-31 22:44:49

标签: web-services rest

我使用的系统要求审核每个更改并为每个更改指定原因。在努力保持良好的REST设计时,我们希望正确使用HTTP动词。

关于这个特殊情况,我不确定处理这种情况的最佳方法。让我们说我们有一个简单的实体:

URL:  /users/100
JSON: { username: 'usr1', firstName: 'John', lastName: 'Smith' }

现在,如果我想更新' usr1'对于' user1',我们的系统要求我指定更改的原因。

如果没有更改原因要求,我们可以轻松地将JSON保存到URL。

我的问题是将更改原因发送到服务器的最佳方法是什么。以下是我到目前为止提出的选项:

  • 向实体添加changeReason属性。
  • 将changeReason添加为查询参数。
  • 添加changeReason标头。

这些选项对我来说都不合适。有没有人以前处理过这个问题?

2 个答案:

答案 0 :(得分:1)

首先,对您提出的解决方案有一些想法:

  • changeReason添加到JSON对象:不好,因为(如果使用相同的mime-typeGET则不需要该字段。
  • 作为查询参数:错误,因为它不是资源的参数(但对于请求而言)
  • 标题:错误,因为这是一个带外信息。

因此,当然这些信息应该是请求表示的一部分,并且更新发生在用户身上,因此URL不应该更改(它是相同的资源)。我提出了PATCH方法,这个方法似乎是为了你描述的确切目的而创建的。

使用PATCH方法,您必须描述“更改”表示,该表示专门描述您要应用于资源的更改。此文档格式将与任何资源格式不同,然后可以包含“changeReason”。看起来像这样:

PATCH /users/100
Content-Type: application/vnd.company.auditedchange+json

{
   "replaceFields": {
      "username": "user1"
   }
   "changeReason": "Typo in username."
}

答案 1 :(得分:0)

引入新资源userchangePOST以及有关变更的信息。

POST /userchange
Content-Type: application/json

{
  "id": 100,
  "changes": {
    "username": "user1"
  },
  "reason": "fixed name"
}

服务器将对用户执行更改并记录原因。