我应该使用哪种资源来保存我的API RESTFul?

时间:2015-12-16 13:50:41

标签: api rest asp.net-web-api restful-url restful-architecture

我正在构建API以允许API的客户端发送通知以提醒用户更新订单状态。到目前为止,有两个通知:

  • 当用户未按订单标记订单时;
  • 当用户未将订单标记为已完成时。

我想构建此API,以便扩展到与订单相关的其他通知,但为此API的客户端保留一个简单的URI。 如何定义我的资源以保持我的API RESTFul?

我在考虑使用其中一种结构:

选项1

POST: /api/ordernotification/receive/{id}
POST: /api/ordernotification/complete/{id}

选项2(省略资源中的状态并将其发布)

POST: /api/ordernotification/?id={id}&statusID={statusID}

修改

选项2.1(保留明确的URI,如@Jazimov所建议的)

POST: /api/ordernotification/{statusID}/{id}. 

哪个选项更合适?一种选择对另一种选择有什么好处吗?或者还有其他我没想过的选择吗?

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您有两种类型的ordernotifications:用于通知receive的用户和用于通知complete的用户。如果这些是两个独立的数据模型,那么我认为嵌套它们是一个好主意(即一个名为ReceiveOrderNotificationCompleteOrderNotification的表。如果是这种情况,那么您可能希望完全公开两个不同的端点,例如POST /api/receiveordernotificationPOST /api/completeordernotification

但我不认为这是你能做的最好的,因为订单通知之间可能有很多重叠的相似之处。现在,选项2更像是GET,因为您正在使用查询参数,因此使用您的第一个选项让我们将它们折叠为:

POST: /api/ordernotification/

然后传递一些JSON数据来创建通知

{
    "orderId": "orderId",
    "userId": "userId",
    "prompt": "not marked received/not marked done"
}

我还删除了/{id},因为当你POST创建一个全新的东西时,通常还没有创建id。即使客户端正在创建id并将其发送到API,最好将其保持打开状态,以便您的API能够以自己的方式处理创建新的独特资源。

这是RESTful,因为POST会创建包含特定数据点的资源ordernotification。您的第一个选项使操作本身成为资源,但可能未在后端的任何数据模型中表示。为了尽可能地保持REST,您的API端点应该代表数据库域(表,集合等)。然后,让您的控制器根据请求中发送的数据选择要使用的服务方法。否则,REST端点会预先公开所有逻辑,并成为一长串不可维护的端点。

答案 1 :(得分:1)

我会沿着这些方向去做一些事情

__main__

以后可以通过

访问
multiprocessing.forking.Popen

或者

<?php 
if(isset($_POST['submit']))
{
    if(empty($_POST['word'])) {
        echo "<center>Title do not match. Please insert the correct title.</center>";}
    else 
    {
        if(isset($_POST['word']) && !empty($_POST['word']))
        {
            require 'config.php';   
            $word = $_POST['word'];
            $query="SELECT * FROM data WHERE word LIKE '%" . $word . "%'";
            $sql = $conn->query($query); ?>
            <?php if(!$sql)
            {
                echo "<center>No Record</center>";
            }
            ?>
            <table class="table table-bordered table-hover table-striped">
                <tr>
                    <td width="258" align="center" class="style5">TITLE</td>
                    <td width="170" align="center" class="style5">MENTION</td>
                </tr>
                <?php 
                if($sql ==true) 
                {
                    while($row = $sql->fetch_assoc()) 
                    {
                        $dataID = $row['dataID'];
                        ?> 
                        <tr>
                            <td style="text-transform:uppercase" align="center"> 
                                <a href="admindisplay.php?id=<?php echo $row{'dataID'}?>"> 
                                    <span style="text-transform:uppercase"><?php echo $row{'word'};?></span> 
                                </a>
                            </td>
                            <td style="text-transform:uppercase" align="center">
                                <span style="text-transform:uppercase"><?php echo $row{'mention'};?></span>
                            </td>
                        </tr>
                <?}}
                else 
                {?>
                <tr>
                    <td colspan=2>Results Not Found.</td>
                </tr>
                <?}?>
            </table>
<?php
        }
    }
}
?>

对URI的语义丰富程度没有实际限制,所以你也可以利用它并明确。

答案 2 :(得分:0)

我认为,要更新已插入记录的状态,您的端点应该是PUT而不是POST。

您可以使用

PUT: /api/ordernotification/:id/status/

使用客户端json数据

 {
     "status": "your_status"
 }

根据请求数据,端点应该更新记录。