Webapi 路由 (1) RESTFUL风格

1.vs2015 新建一个mvc项目,勾选webapi

项目默认已经添加了webapi的路由:

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

这个默认的路由跟mvc默认路由有区别,它不带action,所以非常适合用来构建RESTFUL风格的服务

路由的申明要先于mvc,否则路由过来时,先从mvc的路由中匹配,导致匹配失败

2.新建一个Product类 和 相应的控制器 ProductsController

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }

    public class ProductsController : ApiController
    {
        List<Product> products = new List<Product>()
       {
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
       };

        public IEnumerable<Product> Get()
        {
            return products;
        }

        public IHttpActionResult Get(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                return NotFound();
            }
            return Ok(product);
        }

        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="form">表单对象,它是唯一的</param>
        /// <returns></returns>
        public bool Post(Product entity)
        {
            products.Add(entity);
            return true;
        }

        public bool Put(Product entity)
        {
            var product = this.products.FirstOrDefault(p => p.Id == entity.Id);
            if (product != null)
            {
                product.Name = entity.Name;
                product.Category = entity.Category;
                product.Price = entity.Price;
                return true;
            }
            return false;
        }

        public bool Delete(string id)
        {
            return true;
        }
    }

3.前台调用

3.1 get: 其中data 对应的是查询参数,如果有则匹配Get(int id) 方法,它与在url中加参数 url: "api/products/1"效果是一样的,如果既在url里加参数又实用data,则url里的参数值会被data覆盖掉,也就是说Get(int id) 接收到的id会是data里指定的

     function get() {
            $.ajax({
                url: "api/products",
                type: "GET",
                data: { "ID": 1 },
                success: function (data) {
                    alert(JSON.stringify(data));
                }
            });
        }

3.2 post

                var postdata = {
                    Name: $("#Name").val(),
                    Category: $("#Category").val(),
                    Price: $("#Price").val()
                };

                $.ajax({
                    type: ‘POST‘,
                    url: ‘api/products‘,
                    data: postdata,
                    dataType: ‘json‘,
                    success: function (data, textStatus) {
                        alert("添加成功");
                    },
                    error: function (xmlHttpRequest, textStatus, errorThrown) {
                        alert(‘errot:‘ + errorThrown);
                    }
                });

3.3 put

                var postData = {
                    Id: $("#ID").val(),
                    Name: $("#Name1").val(),
                    Category: $("#Category1").val(),
                    Price: $("#Price1").val(),

                };

                $.ajax({
                    type: ‘PUT‘,
                    url: ‘api/Products‘,
                    data: postData,
                    dataType: ‘json‘,
                    success: function (data, textStatus) {
                        alert("修改成功!");
                        $(‘#UpdateUserDialog‘).dialog(‘close‘);
                        $("#test").datagrid("reload");
                    },
                    error: function (xmlHttpRequest, textStatus, errorThrown) {
                        alert(‘errot:‘ + textStatus);
                    }
                });

3.4 delete

               $.ajax({
                            type: ‘DELETE‘,
                            url: ‘api/products/‘ + ids,
                            success: function (data, textStatus) {
                                alert("删除成功!");
                                $("#test").datagrid("reload");
                            },
                            error: function (xmlHttpRequest, textStatus, errorThrown) {
                                alert(‘errot:‘ + errorThrown);
                            }
                        });

4.问题

每中获取方式对应的方法只能有一个,如果声明两个[HttpPost]的方法,那么post调用时,就会报:500 的错

时间: 2024-08-07 13:41:54

Webapi 路由 (1) RESTFUL风格的相关文章

C#进阶系列——WebApi 路由机制剖析:你准备好了吗?

前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分. 它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home/Index,那么你只需要配置一个默认路由就能简单搞定: 它可以很神秘:你的url可以千变万化,看到一些看似“无厘头”的url,感觉很难理解它如何找到匹配的action,例如/api/user/1/detail,这样一个url可以让你纠结半天. 它可以很晦涩:当面试官提问“请简单分析下MVC路由机制的原理”,你可能事先就准备好了答案,然后噼里啪啦一顿(型如

WebApi路由机制详解

随着前后端分离的大热,WebApi在项目中的作用也是越来越重要,由于公司的原因我之前一直没有机会参与前后端分离的项目,但WebApi还是要学的呀,因为这东西确实很有用,可单独部署.与前端和App交互都很方便,既然有良好的发展趋势,我们当然应该顺势而为——搞懂WebApi! 从MVC到WebApi,路由机制一直都在其中扮演着重要的角色. 它可以很简单:如果你只需要会用一些简单的路由,如/Home/Index那么你只需要配置一个默认路由就能搞定. 它可以很神秘:你的url可以千变万化,看到一些“无厘

Restful风格wcf调用4——权限认证

写在前面 在前面的三篇文章,已经介绍了restful风格wcf,如何实现增删改查以及文件的上传下载操作.本篇文章将介绍一下,调用restful的权限认证的内容.在调用的接口,为了安全,总会需要对请求进行权限认证的.以防一些非法的操作. 系列文章 Restful风格wcf调用 Restful风格wcf调用2——增删改查 Restful风格wcf调用3——Stream 一个例子 在REST WCF中,我们可以利用 HttpHeader 来完成这一目标. 首先我们添加一个校验身份的一个方法. ///

Restful风格wcf调用

写在前面 公司有个项目,需要和sharepoint集成,用到了restful,在网上查了一下,wcf方式来实现,还是很方便的,就采用了这种方式,至于web api,没研究过,由于接口急着用,就采用wcf了,用起来也比较顺手. 概念 什么是rest? REST 描述了一个架构样式的互联系统(如 Web 应用程序).REST 约束条件作为一个整体应用时,将生成一个简单.可扩展.有效.安全.可靠的架构.由于它简便.轻量级以及通过 HTTP 直接传输数据的特性,RESTful Web 服务成为基于 SO

Restful风格wcf调用3——Stream

写在前面 上篇文章介绍了restful接口的增删改查,本篇文章将介绍,如何通过数据流进行文件的上传及下载操作. 系列文章 Restful风格wcf调用 Restful风格wcf调用2——增删改查 一个例子 添加一个wcf服务,并在global.asax中注册路由,并修改svc文件的标记,添加Factory属性. //注册路由 System.Web.Routing.RouteTable.Routes.Add(new System.ServiceModel.Activation.ServiceRou

【译】使用python创建一个简单的restful风格的webservice应用

这是一个如何使用python快速构建简单restful风格webservice的应用教程. 1.分析rest路由规则 rest风格的服务通常使用web.py来创建服务器端脚本,一般情况下包含两个url路径: 一个是为了查询所有用户,一个是为了查询单个用户. 例如下面的url: http://localhost:8080/users http://localhost:8080/users/{id} 2.搭建web.py环境 首先你应该安装web.py模块到你的python环境下.如果你之前没有的话

让python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求

这两天在用python的bottle框架开发后台管理系统,接口约定使用RESTful风格请求,前端使用jquery ajax与接口进行交互,使用POST与GET请求时都正常,而Request Method使用PUT或DELETE请求时,直接爆“HTTP Error 405: Method Not Allowed”错误.而ajax提交的Request Method值DELETE也变成了OPTIONS了. 度娘了好多答案,要么说是浏览器不支持,要么说自己重新封装jquery,还有其他的一些方法...

进入全屏 nodejs+express+mysql实现restful风格的增删改查示例

首先,放上项目github地址:https://github.com/codethereforam/express-mysql-demo 一.前言 之前学的java,一直用的ssm框架写后台.前段时间接触到node.js,于是花了两天时间学了一下node.js并写了一个CRUD简单示例.由于前几天一直学用github pages搭建博客,一直没时间写README,今天有空补了上来. 下面来内容自于项目的README. 二.项目介绍 基于node.js + express + mysql实现的re

thinkphp5设置项目为restful风格

我用的是thinkphp5.0.16 环境是 LAMP(linux+apache+mysql5.6+php5.6) 首先去官网下载一个thinkphp5.0.16的完整版,然后放到apache指定的项目运行目录下 然后下一步也就是第一步,我们先开启路由完整匹配模式,这个配置在config.php这个文件里. // 路由使用完整匹配'route_complete_match' => true, 设置成true就可以 下一步就开始创建你的restful风格的目录了比如我想设置的前台模块的登录路由为a