C# 为什么HTTP PUT请求必须在URL(以及请求正文)中传递实体键?

C# 为什么HTTP PUT请求必须在URL(以及请求正文)中传递实体键?,c#,rest,key,httprequest,put,C#,Rest,Key,Httprequest,Put,考虑一个RESTful服务,它公开类型为Product的实体,其类声明如下: public class Product { [Key] public int ID { get; set; } public string Name { get; set; } public double Price { get; set; } } 现在假设我们想要完全更新产品,它的ID是123。然后,我们可以通过执行标准HTTP PUT请求(如下所示)轻松做到这一点: PUT /o

考虑一个RESTful服务,它公开类型为
Product
的实体,其类声明如下:

public class Product
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public double Price { get; set; }
}
现在假设我们想要完全更新
产品
,它的
ID
123
。然后,我们可以通过执行标准HTTP PUT请求(如下所示)轻松做到这一点:

PUT /odata/Products(123) HTTP/1.1
Host: localhost:1337
Content-Type: application/json

{
    "ID": 123,
    "Name": "Shirt",
    "Price": 19.99
}

重复按键两次的理由是什么?即使我们从URL中省略了
ID
键,我们是否仍然能够完全更新
产品
实体,因为我们总是可以从请求体中提取键?我知道PUT是幂等的,使用PATCH而不是PUT可以完全避免这种冗余问题,但我只是想知道这种奇怪约定背后的动机。我试着读了一遍,但他们似乎没有谈论这一点。

PUT是一个完全的替代品。无论您放弃什么,都将完全替换URL中ID处的内容

如果您在URL和数据中向上传递ID,那么服务器不需要知道数据中的哪个字段是ID。它只是全面替换URL中ID处的任何内容。让它在服务器端保持简单


这也意味着,如果您真的愿意,您可以更改ID。

PUT是一个完整的替换。无论您放弃什么,都将完全替换URL中ID处的内容

如果您在URL和数据中向上传递ID,那么服务器不需要知道数据中的哪个字段是ID。它只是全面替换URL中ID处的任何内容。让它在服务器端保持简单


这也意味着,如果您真的愿意,您可以更改ID。

PUT是一个完整的替换。无论您放弃什么,都将完全替换URL中ID处的内容

如果您在URL和数据中向上传递ID,那么服务器不需要知道数据中的哪个字段是ID。它只是全面替换URL中ID处的任何内容。让它在服务器端保持简单


这也意味着,如果您真的愿意,您可以更改ID。

PUT是一个完整的替换。无论您放弃什么,都将完全替换URL中ID处的内容

如果您在URL和数据中向上传递ID,那么服务器不需要知道数据中的哪个字段是ID。它只是全面替换URL中ID处的任何内容。让它在服务器端保持简单


这也意味着,如果您真的愿意,您可以更改ID。

简单的回答是HTTP PUT不在乎,这就是为什么您在HTTP规范中找不到任何关于此的内容

(稍微)长一点的答案是REST出于一致性的原因需要它。所有REST调用都使用一个URI,该URI唯一地标识所操作的资源

在REST中,PUT意味着“用我发送给您的资源替换URI表示的资源的内容”。如果您的URI引用了一个集合,并且您发送了一个对象,那么RESTAPI可能会将此视为错误

因此,PUT操作实际上是DELETE和POST的组合。根据数据的性质,为主键添加新值以替换旧值可能是完全有效的。在大多数结构中,我都认为这是坏的形式,但就休息而言,这样做完全可以。


关于休息有很多问题。这是一个很好的答案,我多次引用它,它给出了一个相当简单的解释,说明了集合与成员之间的各种动词的含义。

简短的回答是HTTP PUT不在乎,这就是为什么在HTTP规范中找不到关于这一点的任何内容

(稍微)长一点的答案是REST出于一致性的原因需要它。所有REST调用都使用一个URI,该URI唯一地标识所操作的资源

在REST中,PUT意味着“用我发送给您的资源替换URI表示的资源的内容”。如果您的URI引用了一个集合,并且您发送了一个对象,那么RESTAPI可能会将此视为错误

因此,PUT操作实际上是DELETE和POST的组合。根据数据的性质,为主键添加新值以替换旧值可能是完全有效的。在大多数结构中,我都认为这是坏的形式,但就休息而言,这样做完全可以。


关于休息有很多问题。这是一个很好的答案,我多次引用它,它给出了一个相当简单的解释,说明了集合与成员之间的各种动词的含义。

简短的回答是HTTP PUT不在乎,这就是为什么在HTTP规范中找不到关于这一点的任何内容

(稍微)长一点的答案是REST出于一致性的原因需要它。所有REST调用都使用一个URI,该URI唯一地标识所操作的资源

在REST中,PUT意味着“用我发送给您的资源替换URI表示的资源的内容”。如果您的URI引用了一个集合,并且您发送了一个对象,那么RESTAPI可能会将此视为错误

因此,PUT操作实际上是DELETE和POST的组合。根据数据的性质,为主键添加新值以替换旧值可能是完全有效的。在大多数结构中,我都认为这是坏的形式,但就休息而言,这样做完全可以。


关于休息有很多问题。这是一个很好的答案,我多次引用它,它给出了一个相当简单的解释,说明了各种动词对于集合和成员的含义。

简短的回答是HTTP PUT不在乎,这就是为什么你不在乎