C# REST标准-输出模型是否应始终与输入模型匹配?

C# REST标准-输出模型是否应始终与输入模型匹配?,c#,rest,asp.net-web-api,C#,Rest,Asp.net Web Api,因此,我要求部分输出模型必须包含UI重要信息。这些信息基本上是文本翻译和日期、价格、长度的建议格式 因此,输出模型的示例可以是: { statuses : { enumValue1 : "Display This Text", enumValue2 : "Display This Text2", }, thePrice : { value : 3.50, formattedValue : "$3.50" }, length : { me

因此,我要求部分输出模型必须包含UI重要信息。这些信息基本上是文本翻译和日期、价格、长度的建议格式

因此,输出模型的示例可以是:

{
  statuses : {
    enumValue1 : "Display This Text",
    enumValue2 : "Display This Text2",
  },
  thePrice : {
    value : 3.50,
    formattedValue : "$3.50"
  },
  length : {
    meters 3,
    formattedValue : "3 ft."
  },
  iAmAPropertyOnlyInGet : 42
}
现在,如果我把它作为我的输出模型,有一个完全不同的输入模型“可以”吗

{
  status : {
    enumValue1,
    enumValue2,
  },
  thePrice : 3.50,
  lengthInMeters : 3  
}

这取决于您希望为客户(REST服务消费者)提供何种灵活性

如果您维护相同的模型,那么使用者可以加载现有模型,修改值,然后将其发送回,这在CRUD场景中非常自然

但是,如果您希望有两种不同的场景:1-导入数据和2-导出数据,那么它们可能会有所不同


通常,将其视为应用程序(问题域)中的一个模型。定义服务器端模型结构(这显然是一个),然后考虑公开它的方法。在我看来,当我看问题中概述的这两个模型时,它们似乎很相似。我甚至建议支持任何输入格式(这两种格式中的任何一种)和一种输出格式(每次可能取决于请求头)。

除了数据本身,我还将元信息保存在单独的对象中

所以在JSON响应中,第一个对象如下

{ meta:  { priceformat: $, lengthformat: ft },
 thePrice: 3.50,
 length: X
}

发送到源服务器的表示可能与接收到的表示完全不同。考虑Web浏览器的工作方式。您获得
text/html
,然后发布
application/x-www-urlencoded-form

当使用PUT方法时,如果不完全相同,您所放置的内容和得到的内容是相似的,这是正常的

REST体系结构样式对HTTP有效负载的形状没有任何限制,除了必须在消息中显式指定语义这一事实


因此,事实上,在客户机和服务器之间共享模型类型而不在消息中明确标识该类型违反了自描述性REST子约束

不允许作为输入的属性如何?我修改了模型以便更准确地处理这个问题。据我所知,您所说的是冗余数据。这些可能会被忽略,因为通常有很多你不在乎的垃圾。另一方面,应该验证预期的输入(使用MVC中的注释属性进行模型验证)。+1表示“如果您维护相同的模型,那么消费者可以加载现有模型,修改值,然后将其发送回,这在CRUD场景中非常自然。”这是如何处理枚举的文本值的?我不确定我是否得到了您的关注,但枚举文本值可以作为单独的对象处理,就像meta一样,所以所有可用格式的列表都可以作为meta?meta:{statuses:{foo:“bar”,foo2:“bar2”},model:{statuses:[foo]}?我看到这个解决方案的一个问题是,用户必须知道何时应用lengthformat元数据。我们有重量、长度和距离。如果他们使用我们的项目集合,他们会循环并向用户显示它们。他们怎么知道藏品中有哪些?他们必须根据名字来决定?你确定你的服务真的需要休息吗?返回JSON的服务不一定是REST。“需要”是一个奇怪的术语。我想说的是,该项目强烈希望构建一个标准的、易于使用的、可理解的API。决定是构建一个RESTAPI以保持事物的标准化。REST不是一个标准。如果你把它当作一个,你会发现你的服务根本没有遵守任何标准。REST是一种架构,您的项目可能不需要所有的架构。例如,是否要求您服务中的所有内容都是“资源”?是否有必要通过URL指定一种资源和另一种资源之间的所有关系?我不知道如何正确回答您的问题。人们会做出这样的决定,所以如果一个人对此表示同意,那么这就是同意,否则就不是。因此,服务本身不可能有这样的要求,而是决策者。所以,如果我只是武断地说是的,那只是我自我实现了休息的要求。它是通过HTTP公开的API,利用HTTP协议访问资源。所有的决定都是由人做出的。我们这样做是因为它让我们了解了服务将如何运行。当我询问模型是否应该匹配时,我可能需要澄清,我是在问“如果您得到的是REST API,它们是否应该匹配?这对您有关系吗?”+1“可能与您收到的表示完全不同”那么一个人应该如何从API更新资源呢?@BradLaney不确定我是否理解你的问题。你必须明确你发送的内容,但是服务器可以自由地解释它喜欢什么。首先,他们得到了资源。然后他们创建一个新类型来放置,然后他们将所有内容从get对象复制到put对象,然后更新他们想要更改的字段。然后他们提交put对象,希望他们没有犯错误,并更新他们不想要的东西。