URI template for POST/PUT restful service

33,331

Solution 1

You have to map the URIs as below for Transaction.

Get a transaction by ID - GET - transaction/id

Create a new transaction - POST - transaction

Update a transaction - PUT - transaction/id

Delete a transaction - DELETE - transaction/id

Your URI templates has to be changed as below

[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)
{
    //
}

how client will access these methods for Post and Put with unique URI

You don't need unique URI for POST and PUT. There URIs can be same.

References: 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

Solution 2

PUT is for creating or updating a known resource, for example: PUT /Transactions/1234

This would create (or update if it already exists) the transaction with the ID 1234. This means you can only use PUT when you know the URL of the resource.

POST creates a new child resource, for example: POST /Transactions/

This would create a new transaction resource.

Notice I pluralised Transaction so it now represents a collection.

Not being a C# developer, I don't know how easy this maps to WCF, but this approach is technology-independent.

Share:
33,331
MSUH
Author by

MSUH

Updated on December 02, 2020

Comments

  • MSUH
    MSUH over 3 years

    I am going to write a restful API, my requirement is to call methods on “Transaction” object, I was wondering how I should call Post/PUT with appropriate URI template so that I can Create/update the Transaction resource without using “verbs” in Uri mapping.

    [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);
    }
    

    Please consider that I want to apply best practice for uri mapping and do not want “verbs” in it, only “nouns”. Also tell me how client will access these methods for Post and Put with unique URI. Thanks

  • MSUH
    MSUH almost 12 years
    Thanks Mark for clarifying, I was bit confused about how client will communicate it in more readable way, but i guess client has to call same url but specifying different action i.e. post, put,delete while calling Api method.
  • RobJohnson
    RobJohnson over 11 years
    @Mark, Why do both of these methods return a Transaction object? I understand that the POST method might need this as the Id could be an auto generated number on a database, but why the PUT method? Thanks.
  • Rajiv
    Rajiv over 10 years
    The second example will compile but will fail to activate because variables for UriTemplate path segments must be 'string'
  • JoseHdez_2
    JoseHdez_2 almost 6 years
    The link seems to be dead.