【问题标题】:How to create Ror style Restful routing in Asp.net MVC Web Api如何在 Asp.net MVC Web Api 中创建 Ror 风格的 Restful 路由
【发布时间】:2013-06-26 01:55:25
【问题描述】:

如何在 asp.net web api 中配置路由,以便我可以在我的 ApiController 继承类中为以下操作编写代码?

|=================================================== ======================================| |Http动词|路径|动作|用于| |=================================================== ======================================| |获取 | /照片 |索引 |显示所有照片列表 | |获取 | /照片/新 |新 |返回用于创建新照片的 HTML 表单 | |发布 | /照片/ |创建 |创建一张新照片 | |获取 | /照片/:id |显示 |显示特定照片 | |获取 | /照片/:id/编辑 |编辑 |返回用于编辑照片的 HTML 表单 | |放 | /照片/:id |更新 |更新特定照片 | |删除 | /照片/:id |销毁|删除特定照片 |

【问题讨论】:

  • 您是在尝试返回浏览器友好的 HTML 页面、API 样式的数据响应,还是两者兼而有之?在我看来,您正在尝试返回 HTML,在这种情况下您不想使用 WebAPI。你只想使用 MVC。
  • 嗨,Brian,我正在返回 json,正在使用 Knockout 和 SammyJS 开发单页应用程序

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing asp.net-web-api


【解决方案1】:

我发现http://restfulrouting.com/ 非常有用。它也允许嵌套资源。

【讨论】:

    【解决方案2】:

    以下是我自己的解决方案:
    //路由配置:

    //GET     | /photos          |  index   | display a list of all photos    
    config.Routes.MapHttpRoute(
        name: "DefaultIndex",
        routeTemplate: "api/{controller}",
        defaults: new {action = "Index"},
        constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
    );
    
    //POST    | /photos/         |  create  | create a new photo
    config.Routes.MapHttpRoute(
        name: "DefaultCreate",
        routeTemplate: "api/{controller}",
        defaults: new { action = "Create" },
        constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }
    );
    
    //GET     | /photos/new      |  new     | return an HTML form for creating a new photo |
    config.Routes.MapHttpRoute(
        name: "DefaultNew",
        routeTemplate: "api/{controller}/new",
        defaults: new { action = "New" },
        constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
    );
    
    //GET     | /photos/:id      |  show    | display a specific photo    
    config.Routes.MapHttpRoute(
        name: "DefaultShow",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { action = "Show" },
        constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
    );
    
    //PUT     | /photos/:id      |  update  | update a specific photo   
    config.Routes.MapHttpRoute(
        name: "DefaultUpdate",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { action = "Update" },
        constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) }
    );
    
    //DELETE  | /photos/:id      |  destroy | delete a specific photo 
    config.Routes.MapHttpRoute(
        name: "DefaultDestroy",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { action = "Destroy" },
        constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) }
    );
    
    config.Routes.MapHttpRoute(
        name: "DefaultEdit",
        routeTemplate: "api/{controller}/{id}/edit",
        defaults: new { action = "Edit" },
        constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
    );
    

    //ApiController 动作

    // GET api/photo
    [ActionName("Index")]
    public string Get()
    {
        return "Index Action called";
    }
    
    
    // GET api/photos/5
    [ActionName("Show")]
    public string Get(int id)
    {
        return "Show action called"
    }
    
    // GET api/photos/5/edit
    [HttpGet]
    public string Edit(int id)
    {
        return "Edit action called";
    }
    
    // POST api/photos
    [ActionName("Create")]
    public void Post([FromBody]string value)
    {
    
    }
    
    // GET api/photos/new
    [HttpGet]
    public string New()
    {
        return "New called";
    }
    
    // PUT api/photos/5
    [ActionName("Update")]
    public void Put(int id, [FromBody]string value)
    {
    }
    
    // DELETE api/photos/5
    [ActionName("Destroy")]
    public void Delete(int id)
    {
    }
    

    【讨论】:

    • 你都错了,这不平静。 Restful 并没有说你在 url 中有 CRUD 名称。这完全不是 REST 的完成方式。您在 HttpReques 中使用 HTTP 动词来确定您是否正在执行更新、创建、删除(因此 GET、POST、ETC。)确定操作,您不应该在 url 中进行操作。您将 RESTful url 映射到控制器中的操作方法。在控制器中,您将拥有 Create Delete、Update 方法。不是称为 GEt 的方法。你倒过来了。
    • 嗯,我假设您没有使用过 WebApi?在这种情况下,他的例子非常好。他编写 GET 的原因是,框架将其作为 HttpGet 用于该控制器中的给定函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2014-09-15
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多