出于某种原因,我可以将这两个JSON请求发送到我的WebAPI,它将接受并创建一个用户。一个有双引号,一个没有。
{"Username":"Bob", "FirstName":"Foo", "LastName":"Bar", "Password":"123", "Headline":"Tuna"}
{Username:"Bob", FirstName:"Foo", LastName:"Bar", Password:"123", Headline:"Tuna"}
这是创建用户的方法。
// localhost:12345/api/controller/create
[ActionName("create")]
public HttpResponseMessage PostUser(User user)
{
if (ModelState.IsValid)
{
db.Users.Add(user);
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, user);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = user.UserId }));
return response;
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
}
但是,我可以在URL末尾没有/create
的情况下成功发出POST请求。我假设POST请求成功的原因是因为动作名称是否存在,它将在方法名称中搜索Post
。
所以我的问题是,动作名称的目的是什么呢?我怎样才能使它成为URL中必须的?另外,为什么它接受两个JSON请求以及如何让它接受一个或另一个。
修改
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Routing by Action-name
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{username}",
defaults: new { username = RouteParameter.Optional }
);
感谢您的时间
/两次
答案 0 :(得分:1)
我怎样才能使它成为URL中必须的?
通过更改~/App_Start/WebApiConfig.cs
中的路线定义并明确在路线中显示操作名称:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
另外,为什么它接受两个JSON请求以及如何让它接受一个或另一个。
因为Web API使用JSON.NET作为接受它们的JSON序列化程序。
答案 1 :(得分:0)
如果您在App_Start
查看为您的API调用注册的路线,您会看到:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
您会注意到没有指定action
。如果要映射到操作名称,可以将其更改为:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "get", id = RouteParameter.Optional }
);
但是你总是需要设置一个动作(除非它是默认的GET
)。你不能再POST
直接控制脚趾,你总是需要添加action
。
Per this link默认行为是查找以所使用的HTTP方法开头的方法:
要查找操作,Web API会查看HTTP方法,然后查看 对于名称以该HTTP方法名称开头的操作。对于 例如,通过GET请求,Web API会查找启动的操作 使用“Get ...”,例如“GetContact”或“GetAllContacts”。这个 约定仅适用于GET,POST,PUT和DELETE方法。您可以 通过使用控制器上的属性启用其他HTTP方法。 我们稍后会看到一个例子。
另一种选择是为您的不同GET
来电创建不同的控制器,这是我过去所做的。