我想制作一个传递4个参数的web api.
这是我的路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{email}/{firstname}/{lastname}/{source}"
);
Run Code Online (Sandbox Code Playgroud)
这是方法签名
public string GetId(string email, string firstname, string lastname, string source)
Run Code Online (Sandbox Code Playgroud)
这是调用网址
http://fakedomain.com/api/Contacts/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123
Run Code Online (Sandbox Code Playgroud)
我收到404错误.
如果我在路由配置中将每个参数设置为可选,并使用默认值设置每个参数,则会调用它.但是,每个参数都获取默认值,而不是传递的值.
我觉得我很亲近,我错过了什么?
ves*_*ous 32
您不需要特殊的路由记录来处理多个参数.您创建的路由记录将查找以下路由
/api/controller/Dan@dan.com/Dan/FunnyLastName/TheCoffeeShop
但是你试图传递参数,而不是指定路线.
使用此路由记录:
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional, action = "DefaultAction" });
Run Code Online (Sandbox Code Playgroud)
以下GET端点:
public HttpResponseMessage Get(int requestId = 0, string userName = null, string departmentName = null, bool includeCompleted = false)
{
//code
}
Run Code Online (Sandbox Code Playgroud)
可能被击中:
/api/controllername/?requestId=15&username=Dan
Run Code Online (Sandbox Code Playgroud)
要么
/api/controllername/?departmentName=SoftwareEngineering
Run Code Online (Sandbox Code Playgroud)
或任何其他参数组合(或没有参数,因为它们有默认值)
由于您有一个"命名"操作(GetId)而不是默认操作(GET,POST,PUT ..),这会使事情变得复杂,您必须设计一个自定义路由来处理操作名称.以下是我用于自定义操作名称的内容(在此示例中需要id)
config.Routes.MapHttpRoute("ActionRoute", "api/{controller}/{action}/{id}");
Run Code Online (Sandbox Code Playgroud)
您的端点必须明确接受名为"id"的一个参数
public HttpResponseMessage LockRequest(int id, bool markCompleted)
{
//code
}
Run Code Online (Sandbox Code Playgroud)
该端点将在以下路径中被击中:
/api/controllerName/LockRequest/id?markCompleted=true
Run Code Online (Sandbox Code Playgroud)
遵循RESTful规范,最好尽可能远离自定义操作名称.大多数情况下,您可以使用普通的HTTP谓词,只使用命名操作来操作现有项(因此在我的示例中需要ID).对于您的代码,您可以只有两个GET端点,一个获取特定ID以获取项目,一个根据"搜索参数"返回所有项目(包括ID).
public HttpResponseMessage Get(int id)
public HttpResponseMessage Get(int requestId = 0, string userName = null, string departmentName = null, bool includeCompleted = false)
Run Code Online (Sandbox Code Playgroud)
这些都将由默认路由记录处理.
确保您在WebApiConfig.cs文件中具有默认的api路由设置.
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "ContactApi",
routeTemplate: "api/{controller}/{email}/{firstname}/{lastname}/{source}"
);
}
}
http://fakedomain.com/api/Contacts/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123
Run Code Online (Sandbox Code Playgroud)
注意:我用localhost替换了fakedomain并且它有效...(localhost/api/Contacts/GetId?email=user@domain.com&firstname=joe&lastname=shmoe&source=123)
| 归档时间: |
|
| 查看次数: |
52500 次 |
| 最近记录: |