【问题标题】:URI template for POST/PUT restful servicePOST/PUT RESTful 服务的 URI 模板
【发布时间】:2012-06-14 13:05:54
【问题描述】:

我要编写一个 RESTful API,我的要求是调用“Transaction”对象的方法,我想知道如何使用适当的 URI 模板调用 Post/PUT,这样我就可以在不使用的情况下创建/更新 Transaction 资源Uri 映射中的“动词”。

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/Transaction/{**What to write here ????**}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public Transaction AddTransaction(Transaction transaction)
{
    return AddTransactionToRepository(transaction);
}

[OperationContract]
[WebInvoke(Method = "PUT", UriTemplate = "/Transaction/{**What to write here ????**}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
public Transaction UpdateTransaction(Transaction transaction)
{
    return UpdateTransactionInRepository(transaction);
}

请考虑我想对 uri 映射应用最佳实践,并且不希望在其中使用“动词”,而只希望使用“名词”。还告诉我客户端如何使用唯一的 URI 访问 Post 和 Put 的这些方法。谢谢

【问题讨论】:

    标签: wcf api c#-4.0 rest


    【解决方案1】:

    您必须为Transaction 映射如下URI。

    通过 ID 获取交易 - GET - transaction/id

    创建一个新交易 - POST - 交易

    更新交易 - PUT - transaction/id

    删除交易 - 删除 - 交易/id

    您的 URI 模板必须更改如下

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/Transaction", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    public Transaction AddTransaction(Transaction transaction)
    {
        //
    }
    
    [OperationContract]
    [WebInvoke(Method = "PUT", UriTemplate = "/Transaction/{id}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
    public Transaction UpdateTransaction(int id, Transaction transaction)
    {
        //
    }
    

    客户端如何通过唯一的 URI 访问这些 Post 和 Put 方法

    POST 和 PUT 不需要唯一的 URI。 URI 可以相同。

    参考:http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web-api-that-supports-crud-operations

    http://msdn.microsoft.com/en-us/library/bb412172(v=vs.90).aspx

    【讨论】:

    • 感谢 Mark 的澄清,我对客户端如何以更具可读性的方式进行通信有点困惑,但我猜客户端必须调用相同的 url 但指定不同的操作,即在调用 Api 时发布、放置、删除方法。
    • @Mark,为什么这两个方法都返回一个 Transaction 对象?我知道 POST 方法可能需要这个,因为 Id 可能是数据库上自动生成的数字,但是为什么 PUT 方法呢?谢谢。
    • 第二个示例将编译但无法激活,因为 UriTemplate 路径段的变量必须是“字符串”
    【解决方案2】:

    PUT 用于创建或更新已知资源,例如:PUT /Transactions/1234

    这将创建(或更新,如果它已经存在)ID 为 1234 的事务。这意味着您只有在知道资源的 URL 时才能使用 PUT。

    POST 创建一个新的子资源,例如:POST /Transactions/

    这将创建一个新的事务资源。

    请注意,我将 Transaction 复数化,因此它现在代表一个集合。

    不是 C# 开发人员,我不知道这映射到 WCF 有多么容易,但这种方法与技术无关。

    【讨论】:

      【解决方案3】:

      为了制定正确的 url 和 api 设计原则...我发现这本电子书(不是我的!)必读: http://offers.apigee.com/api-design-ebook-rr/

      【讨论】:

      • 链接好像失效了。
      猜你喜欢
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多