Your problems have nothing to do with POST/GET but only with how you specify parameters in RouteAttribute
. To ensure this, I added support for both verbs in my samples.
Let’s go back to two very simple working examples.
[Route("api/deliveryitems/{anyString}")]
[HttpGet, HttpPost]
public HttpResponseMessage GetDeliveryItemsOne(string anyString)
{
return Request.CreateResponse<string>(HttpStatusCode.OK, anyString);
}
And
[Route("api/deliveryitems")]
[HttpGet, HttpPost]
public HttpResponseMessage GetDeliveryItemsTwo(string anyString = "default")
{
return Request.CreateResponse<string>(HttpStatusCode.OK, anyString);
}
The first sample says that the “anyString
” is a path segment parameter (part of the URL).
First sample example URL is:
- localhost:
xxx/api/deliveryItems/dkjd;dslkf;dfk;kkklm;oeop
- returns
"dkjd;dslkf;dfk;kkklm;oeop"
- returns
The second sample says that the “anyString
” is a query string parameter (optional here since a default value has been provided, but you can make it non-optional by simply removing the default value).
Second sample examples URL are:
- localhost:
xxx/api/deliveryItems?anyString=dkjd;dslkf;dfk;kkklm;oeop
- returns
"dkjd;dslkf;dfk;kkklm;oeop"
- returns
- localhost:
xxx/api/deliveryItems
- returns
"default"
- returns
Of course, you can make it even more complex, like with this third sample:
[Route("api/deliveryitems")]
[HttpGet, HttpPost]
public HttpResponseMessage GetDeliveryItemsThree(string anyString, string anotherString = "anotherDefault")
{
return Request.CreateResponse<string>(HttpStatusCode.OK, anyString + "||" + anotherString);
}
Third sample examples URL are:
- localhost:
xxx/api/deliveryItems?anyString=dkjd;dslkf;dfk;kkklm;oeop
- returns
"dkjd;dslkf;dfk;kkklm;oeop||anotherDefault"
- returns
- localhost:
xxx/api/deliveryItems
- returns “No HTTP resource was found that matches the request URI …” (parameter
anyString
is mandatory)
- returns “No HTTP resource was found that matches the request URI …” (parameter
- localhost:
xxx/api/deliveryItems?anotherString=bluberb&anyString=dkjd;dslkf;dfk;kkklm;oeop
- returns
"dkjd;dslkf;dfk;kkklm;oeop||bluberb"
- note that the parameters have been reversed, which does not matter, this is not possible with “URL-style” of first example
- returns
When should you use path segment or query parameters? Some advice has already been given here:
REST API Best practices: Where to put parameters?