空的MVC4应用程序,如何创建一个返回json的简单测试web api控制器

本文关键字:json 返回 简单 控制器 api web 测试 一个 应用程序 MVC4 何创建 | 更新日期: 2023-09-27 18:21:36

我有一个MVC4应用程序,我创建了一个基于测试webapi的控制器,看起来像:

public class User1
    {
        public int Id { get; set; }
        public string name { get; set; }
        public User1(int id, string name)
        {
            this.Id = id;
            this.name = name;
        }
    }
    public class Test1Controller : ApiController
    {
        public User1 Get(int id)
        {
            return new User1(id, "hello");
        }
    }

我注意到我有一个webapiconfig类:

 public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

我假设这将在默认情况下输出json结果,对吗?

当我去:

http://localhost:61146/api/test1/get/1

http://localhost:61146/test1/get/1

我得到这个错误:

The resource cannot be found.

这到底是如何映射的,还是我必须将它放在一个特殊的文件夹中?我猜它会自己映射它,因为我继承了ApiController

空的MVC4应用程序,如何创建一个返回json的简单测试web api控制器

在Web API中,名称Post、Get、Put、Delete(默认情况下)映射为请求方法名称,而不是操作名称。您的API路线是:

api/{controller}/{id}

请求:

api/test1/get/1

找不到合适的匹配,因为框架将尝试将4个令牌与仅有的现有路由定义进行匹配,该路由定义包含3个令牌(字面api和两个令牌:controllerid)。

如果你尝试:

 api/test1/get

框架将正确地找到Test1Controller,但基于路由配置,将把令牌"get"绑定到id参数。当框架试图根据您的请求(GET请求)找到合适的方法时,它会找到Get(int id)并找到匹配项,但无法将令牌"get"转换为整数,这将该方法标记为不适合该请求。

但是,如果您尝试此请求:

api/test1/1

它将把令牌"1"转换为int 1,并且方法Get(int id)将是匹配的。

在Asp.NET Web API中,路由有时会令人困惑。我发现,明确地映射我的路线可以让我更好地理解请求。我建议AttributeRouting,它将集成在下一版本的WebApi中。