2013-04-22 35 views
0

由于某种原因,我可以将这两个JSON请求发送到我的WebAPI,它会接受并创建一个用户。一个用双引号,一个不用。WebAPI接受通过Fiddler发送破碎的JSON

{"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); 
     } 
    } 

但是我能够使没有/create在URL的末尾一个成功的POST请求。我假设POST请求成功的原因是因为无论动作名称是否存在,它都会在方法名称中搜索Post

所以我的问题是,那么动作名称的目的是什么?我怎样才能做到这一点,所以这是必须的网址?另外为什么它接受这两个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

如果您在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

this link的默认行为是寻找与所使用的HTTP方法启动方法:

要查找的动作,网络API着眼于HTTP方法,然后查找 一个动作,其名称以该HTTP方法名称开头。例如,对于带有GET请求的 示例,Web API会查找以“Get ...”开头 的操作,例如“GetContact”或“GetAllContacts”。该公约仅适用于GET,POST,PUT和DELETE方法。您可以使用控制器上的属性 启用其他HTTP方法。 我们稍后会看到一个例子。

另一种选择是为您的不同GET调用创建不同的控制器,这是我过去所做的。

+0

我不知道我明白这是什么'action =“get”'?此外,我更新了我的问题,我包括我的webconfigs,但它仍然无法正常工作。我仍然可以在没有'/ create'的情况下进行POST。 – brk 2013-04-23 09:18:07

+0

'action =“get”'表示默认的'{action}'参数是'“get”'。它试图复制Web API的原始行为。另外,如果您使用的是两条路线,则不进行任何操作的发帖仍然会遵循第一条路线。你需要删除它。 – 2013-04-23 12:49:21

+0

但是,如果我删除第一个配置,那么我将如何能够通过ID获取用户?我希望能够通过当前有效的id和用户名来获取用户。不过,我看到你的意思,它允许我在没有'/ create'的情况下进行POST,因为它会遵循第一个路由配置。任何想法如何设置它而不删除第一个配置或禁止我通过ID获取用户也? – brk 2013-04-23 14:17:38

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序列化程序。

+0

我有两个配置路由,我已经更新了他们的帖子。为什么这不工作?第二个配置,在路由中有一个动作,它只是可选的'username'。 – brk 2013-04-23 08:46:25

+0

,因为第一条路线仍然匹配 – 2014-10-07 01:05:57