WebAPI通过Fiddler接受破坏的JSON发送

时间:2013-04-22 10:30:53

标签: c# json asp.net-mvc-4 asp.net-web-api

出于某种原因,我可以将这两个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 }
        );

感谢您的时间

/两次

2 个答案:

答案 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来电创建不同的控制器,这是我过去所做的。