要添加更多有关您在另一个答案之后的评论中要求的超载的详细信息,以下是摘要。ApiController
显示每个GET
查询将调用哪个操作的注释:
public class ValuesController : ApiController
{
// EXPLANATION: See the view for the buttons which call these WebApi actions. For WebApi controllers,
// there can only be one action for a given HTTP verb (GET, POST, etc) which has the same method signature, (even if the param names differ) so
// you can't have Get(string height) and Get(string width), but you can have Get(int height) and Get(string width).
// It isn't a particularly good idea to do that, but it is true. The key names in the query string must match the
// parameter names in the action, and the match is NOT case sensitive. This demo app allows you to test each of these
// rules, as follows:
//
// When you send an HTTP GET request with no parameters (/api/values) then the Get() action will be called.
// When you send an HTTP GET request with a height parameter (/api/values?height=5) then the Get(int height) action will be called.
// When you send an HTTP GET request with a width parameter (/api/values?width=8) then the Get(string width) action will be called.
// When you send an HTTP GET request with height and width parameters (/api/values?height=3&width=7) then the
// Get(string height, string width) action will be called.
// When you send an HTTP GET request with a depth parameter (/api/values?depth=2) then the Get() action will be called
// and the depth parameter will be obtained from Request.GetQueryNameValuePairs().
// When you send an HTTP GET request with height and depth parameters (/api/values?height=4&depth=5) then the Get(int height)
// action will be called, and the depth parameter would need to be obtained from Request.GetQueryNameValuePairs().
// When you send an HTTP GET request with width and depth parameters (/api/values?width=3&depth=5) then the Get(string width)
// action will be called, and the depth parameter would need to be obtained from Request.GetQueryNameValuePairs().
// When you send an HTTP GET request with height, width and depth parameters (/api/values?height=7&width=2&depth=9) then the
// Get(string height, string width) action will be called, and the depth parameter would need to be obtained from
// Request.GetQueryNameValuePairs().
// When you send an HTTP GET request with a width parameter, but with the first letter of the parameter capitalized (/api/values?Width=8)
// then the Get(string width) action will be called because the case does NOT matter.
// NOTE: If you were to uncomment the Get(string height) action below, then you would get an error about there already being
// a member named Get with the same parameter types. The same goes for Get(int id).
//
// ANOTHER NOTE: Using the nullable operator (e.g. string? paramName) you can make optional parameters. It would work better to
// demonstrate this in another ApiController, since using nullable params and having a lot of signatures is a recipe
// for confusion.
// GET api/values
public IEnumerable<string> Get()
{
return Request.GetQueryNameValuePairs().Select(pair => "Get() => " + pair.Key + ": " + pair.Value);
//return new string[] { "value1", "value2" };
}
//// GET api/values/5
//public IEnumerable<string> Get(int id)
//{
// return new string[] { "Get(height) => height: " + id };
//}
// GET api/values?height=5
public IEnumerable<string> Get(int height) // int id)
{
return new string[] { "Get(height) => height: " + height };
}
// GET api/values?height=3
public IEnumerable<string> Get(string height)
{
return new string[] { "Get(height) => height: " + height };
}
//// GET api/values?width=3
//public IEnumerable<string> Get(string width)
//{
// return new string[] { "Get(width) => width: " + width };
//}
// GET api/values?height=4&width=3
public IEnumerable<string> Get(string height, string width)
{
return new string[] { "Get(height, width) => height: " + height + ", width: " + width };
}
}
如果您想知道,您只需要一条路线即可:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
您可以使用此MVC视图或类似的东西对其进行测试。是的,我知道您不应该将JavaScript与标记混合使用,并且我不会像通常那样使用引导程序,但这只是出于演示目的。
<div class="jumbotron">
<h1>Multiple parameters test</h1>
<p class="lead">Click a link below, which will send an HTTP GET request with parameters to a WebAPI controller.</p>
</div>
<script language="javascript">
function passNothing() {
$.get("/api/values", function (data) { alert(data); });
}
function passHeight(height) {
$.get("/api/values?height=" + height, function (data) { alert(data); });
}
function passWidth(width) {
$.get("/api/values?width=" + width, function (data) { alert(data); });
}
function passHeightAndWidth(height, width) {
$.get("/api/values?height=" + height + "&width=" + width, function (data) { alert(data); });
}
function passDepth(depth) {
$.get("/api/values?depth=" + depth, function (data) { alert(data); });
}
function passHeightAndDepth(height, depth) {
$.get("/api/values?height=" + height + "&depth=" + depth, function (data) { alert(data); });
}
function passWidthAndDepth(width, depth) {
$.get("/api/values?width=" + width + "&depth=" + depth, function (data) { alert(data); });
}
function passHeightWidthAndDepth(height, width, depth) {
$.get("/api/values?height=" + height + "&width=" + width + "&depth=" + depth, function (data) { alert(data); });
}
function passWidthWithPascalCase(width) {
$.get("/api/values?Width=" + width, function (data) { alert(data); });
}
</script>
<div class="row">
<button class="btn" onclick="passNothing();">Pass Nothing</button>
<button class="btn" onclick="passHeight(5);">Pass Height of 5</button>
<button class="btn" onclick="passWidth(8);">Pass Width of 8</button>
<button class="btn" onclick="passHeightAndWidth(3, 7);">Pass Height of 3 and Width of 7</button>
<button class="btn" onclick="passDepth(2);">Pass Depth of 2</button>
<button class="btn" onclick="passHeightAndDepth(4, 5);">Pass Height of 4 and Depth of 5</button>
<button class="btn" onclick="passWidthAndDepth(3, 5);">Pass Width of 3 and Depth of 5</button>
<button class="btn" onclick="passHeightWidthAndDepth(7, 2, 9);">Pass Height of 7, Width of 2 and Depth of 9</button>
<button class="btn" onclick="passHeightWidthAndDepth(7, 2, 9);">Pass Height of 7, Width of 2 and Depth of 9</button>
<button class="btn" onclick="passWidthWithPascalCase(8);">Pass Width of 8, but with Pascal case</button>
</div>