ASP.NET Post Endpoint:正文中的数据模型与查询参数

时间:2018-12-03 22:41:09

标签: c# asp.net asp.net-web-api

使API负责存储文件。

File数据模型看起来像这样

public class File
{
    public Guid Id { get; set; }
    public string Path { get; set; }
    public string Contents { get; set; }
}

因此,通过我在控制器中设置的发布请求(用于创建文件),我需要文件的id,文件path将被存储(相对于我的根路径已预先配置)和文件的contents

我想知道是否更好的做法是要求将File数据模型传递到请求的正文中,还是将idpath都用作查询参数以及请求正文中的contents

1 个答案:

答案 0 :(得分:0)

TL; DR -对正文中的内容使用PUT /files/{id}

这取决于-File的(对您的系统唯一)身份是什么?我在这里假设它是客户端传递的Id,而Path只是元数据。如果路径也是身份的一部分,则需要相应地进行调整。

由于提供和确定身份的是 client ,因此您可能应该更喜欢PUT而不是POST,并在路径中提供身份;例如PUT /files/{id}中包含路径和内容。随后的相同PUT使系统处于相同状态,因此满足了PUT对观察者是幂等的要求。随后的不相同的PUT更新现有内容。

HTTP规范在此处具有一定的灵活性,因此您可以 使用POSTlatest稍微改变了POST的定义(以更广泛地应用),但在original(强调我的)中……

  

POST方法用于请求源服务器接受请求中包含的实体作为请求行中Request-URI所标识资源的新下属

...很明显POST /files可以创建例如目录中的文件(以他们的示例为例),但是POST /files/{id}的意义不大。

This discussion在PUT和POST上还有更多内容。在那里还宣称:

  

请注意,这是一个错误:

POST /questions/<new_question> HTTP/1.1
Host: www.example.com/
     

如果   URL尚未创建,您不应该使用POST来创建它   在指定名称时。这应导致“资源不   找到”错误,因为尚不存在。你应该把   服务器上的资源。