如何为非资源实体设计RESTAPI

如何为非资源实体设计RESTAPI,rest,asp.net-web-api,restful-architecture,Rest,Asp.net Web Api,Restful Architecture,我正在开发一个非常简单的电子商务应用程序,其中UI/html通过一组RESTful API(具体来说是ASP.NET Web API)与服务器进行对话 正确遵循REST后,API将公开资源。这在处理我的域对象(如产品、用户等)时效果很好 但有些功能并不遵循这种模式。例如,当用户输入订单号时,我想检查这是否是有效的订单号。现在我可以做一个简单的getonordersapi并返回notfoundforinvalidateorder GET http://myhost.com/api/orders/S

我正在开发一个非常简单的电子商务应用程序,其中UI/html通过一组RESTful API(具体来说是ASP.NET Web API)与服务器进行对话

正确遵循REST后,API将公开资源。这在处理我的域对象(如产品、用户等)时效果很好

但有些功能并不遵循这种模式。例如,当用户输入订单号时,我想检查这是否是有效的订单号。现在我可以做一个简单的getonordersapi并返回notfoundforinvalidateorder

GET http://myhost.com/api/orders/SomeOrderNumber -> http 404
但这是正确的方法吗?如果我想返回错误代码和消息怎么办?(显然不是订单对象的一部分)

那些甚至不属于我的领域的实体呢。e、 g.我想根据一些参数和条件验证邮政编码。我真的不想要这样的东西

GET http://myhost.com/api/postcodes/SomePostCode -> validation message
如果我想获得当前登录的用户数,应该公开哪种API?如果有人能给我指出任何以前的帖子或有用的文档,那将非常有帮助

  • GET无法正确返回空响应。即使是空响应也意味着
    204无内容
    状态。您应该返回
    404 Not Found
    ,您可以在错误消息正文中解释该订单号无效的原因

  • 无论某个实体是否是您的域的一部分,这对客户端都应该是透明的。同样,您描述的示例是正确的方法

  • 要返回当前登录的用户数,您需要在服务器上存储会话状态,而这样做首先不是RESTful的。您可能希望拥有一个可以通过查询进行筛选的集合资源,并且可以通过上次看到用户时进行筛选。例如:

    获取
    /api/users?最近一次看到\u自=2014-10-31 0:00:00


  • 在响应中,您可以有一个元数据字段或标题,指示该查询的总大小。

    虽然这是一篇旧文章,但仍然希望发布我的评论,因为这可能会帮助其他人

    我们在项目中所做的是,我们创建了EntityResultModel作为所有请求的返回类型

        /// <summary>
        /// Entity Result Model
        /// </summary>
        public class EntityResultModel
        {
            /// <summary>
            /// Gets or sets a value indicating whether this instance is success.
            /// </summary>
            /// <value>
            /// <c>true</c> if this instance is success; otherwise, <c>false</c>.
            /// </value>
            public bool IsSuccess { get; set; }
    
            /// <summary>
            /// Gets or sets the message.
            /// </summary>
            /// <value>
            /// The message.
            /// </value>
            public string Message { get; set; }
    
            /// <summary>
            /// Gets or sets the result data.
            /// </summary>
            /// <value>
            /// The result data.
            /// </value>
            public object ResultData { get; set; }
        }
    
    //
    ///实体结果模型
    /// 
    公共类EntityResultModel
    {
    /// 
    ///获取或设置一个值,该值指示此实例是否成功。
    /// 
    /// 
    ///如果此实例成功,则为true;否则为false。
    /// 
    公共bool issucess{get;set;}
    /// 
    ///获取或设置消息。
    /// 
    /// 
    ///信息。
    /// 
    公共字符串消息{get;set;}
    /// 
    ///获取或设置结果数据。
    /// 
    /// 
    ///结果数据。
    /// 
    公共对象结果数据{get;set;}
    }
    

    所有WebApi请求都将返回此EntityResultModel的对象,使用此对象,您可以验证请求是否成功,甚至可以填充消息,如果需要,还可以在数据属性中返回数据

    谢谢你的回答,佩德罗。[1] 我的意思是404,但写空了!我的坏,现在已经编辑了。您能否给出一个在资源无效/未找到的情况下http响应的非常简短的示例?带有错误消息正文。[3] 这似乎是合理的。