Asp.Net WebApi学习教程之增删改查

webapi简介

在asp.net中,创建一个HTTP服务,有很多方案,以前用ashx,一般处理程序(HttpHandler),现在可以用webapi

微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码可读性强的,上手快的,如果要拿它和web服务相比,我会说,它的接口更标准,更清晰,没有混乱的方法名称,有的只有几种标准的请求,如get,post,put,delete等,它们分别对应的几个操作,下面讲一下:

GET:获取

POST:添加

PUT:修改

DELETE:删除

注意上面公开的API接口都是在XMLHttpRequest情况下调用的,当然你可以使用jquery的ajax组件来完成这个请求调用,它的代码更加面向对象,下面会举例说明。

WebAPI是根据请求头信息(Accept Header)来查找已经格式化注册的响应头信息(Content-Type)来确定它应该返回的输出类型json/xml,浏览器访问基本都是xml,如果只需要json的话可以通过Global.asax设置

protectedvoidApplication_Start(object sender, EventArgs e)

      {//默认JSON          GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

      }

webapi示例(CRUD)

环境:vs2015、iis7、webapi2.0、.net4.5.2

功能:webapi+ajax实现增删改查模型

namespace cms.Model

{public partial class student

    {

        public int ID { get; set; }

        public string name { get; set; }

        public int sex { get; set; }

        public int age { get; set; }

        public System.DateTime timesAdd { get; set; }

    }

}

修改webapi路由

webapi默认路由api/{controller}/{id},如果不喜欢可以修改为api/{controller}/{action}/{id},下边是修改后的代码

public static void Register(HttpConfiguration config)

        {

            config.Routes.MapHttpRoute(

                name: "DefaultApi",

                routeTemplate: "api/{controller}/{action}/{id}",

                defaults: new { id = RouteParameter.Optional }

            );

        }

Controller代码

using System;

using System.Collections.Generic;

using System.Net;

using System.Web.Http;

using cms.BLL;

using cms.Model;

namespace cms.Web.API

{

    public class StudentController : ApiController

    {

        public studentBLL bll = new studentBLL();

        // GET: /api/student/GetList

        public IEnumerable<student> GetList()

        {

            var list = bll.FindList();

            return list;

        }

        // GET: api/Student/Get/5

        public student Get(int id)

        {

            var model = bll.Find(id);

            if (model == null)

            {

                throw new HttpResponseException(HttpStatusCode.NotFound);

            }

            return model;

        }

        //添加方法1:如果要添加的字段和模型刚好匹配就用这个

        // POST: api/Student/Post

        public student Post([FromBody]student entity)

        {

            entity.timesAdd = DateTime.Now;

            return bll.Add(entity);

            //dynamic data = new { name = _name, age = _age };

            //return Json<dynamic>(data);

        }

        //添加方法2:如果要添加的字段和模型不匹配就用这个

        // POST: api/Student/PostAdd

        //注意:webapi post接受数据dynamic,ajax调用时也得把json格式化为字符串才行

        public student PostAdd(dynamic obj)

        {

            student model = new student();

            model.name = obj.name;

            model.sex = obj.sex;

            model.age = obj.age;

            model.timesAdd = DateTime.Now;

            return bll.Add(model);

        }

        // PUT: api/Student/Put/5

        public void Put(int id, [FromBody]student entity)

        {

            student model = bll.Find(id);

            model.name = entity.name;

            model.sex = entity.sex;

            model.age = entity.age;

            if (!bll.Update(model))

            {

                throw new HttpResponseException(HttpStatusCode.NotFound);

            }

        }

        // DELETE: api/Student/Delete/5

        public void Delete(int id)

        {

            if (!bll.Delete(id))

            {

                throw new HttpResponseException(HttpStatusCode.NotFound);

            }

        }

    }

}

html代码

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>webapi教程</title>

    <script type="text/javascript" src="Scripts/jquery-1.8.2.js"></script>

    <style type="text/css">

        h2 {

            border-bottom: solid 1px #ccc;

            padding-bottom: 10px;

        }

        #box_list span {

            margin-right: 30px;

            width: 100px;

            display: inline-block;

        }

        .time {

            width: 200px !important;

        }

    </style>

</head>

<body>

    <h2>webapi create</h2>

    <div>

        <p><input type="hidden" id="iid" /></p>

        <p>姓名:<input type="text" id="name" /></p>

        <p>性别:<input type="text" id="sex" /></p>

        <p>年龄:<input type="text" id="age" /></p>

        <p><input type="button" id="btnAdd" value="添加" />

            <input type="button" id="btnAdd2" value="添加2" />

        <input type="button" id="btnEdit" value="修改" /></p>

    </div>

    <h2>webapi list</h2>

    <div id="box_list"></div>

    <div>

        <input type="button" id="btnDel" value="删除" />

        <input type="button" id="btnView" value="查看" />

    </div>

    <div id="box_view"></div>

    <script type="text/javascript">

        $(function () {

            GetList();

            $("#btnAdd").click(function () {

                var _data = { name: $("#name").val(), sex: $("#sex").val(), age: $("#age").val() };

                $.ajax({

                    type: "post",

                    url: "/api/Student/Post",

                    data: _data,

                    dataType: "json",

                    success: function (data) {

                        alert("添加成功");

                        GetList();

                    },

                    error: function () {

                        alert("添加失败");

                    }

                });

            })

            $("#btnAdd2").click(function () {

                var _data = JSON.stringify({ name: $("#name").val(), sex: $("#sex").val(), age: $("#age").val() });

                $.ajax({

                    type: "post",

                    url: "/api/Student/PostAdd",

                    data: _data,

                    dataType: "json",

                    contentType: 'application/json',

                    success: function (data) {

                        alert("添加成功");

                        GetList();

                    },

                    error: function () {

                        alert("添加失败");

                    }

                });

            })

            $("#btnDel").click(function () {

                var _iid = $('input:radio[name=iid]:checked').val();;

                $.ajax({

                    type: "Delete",

                    url: "/api/Student/Delete/" + _iid,

                    success: function (data) {

                        alert("删除成功");

                        $('input:radio[name=iid]:checked').parents("p").remove();

                    },

                    error: function () {

                        alert("删除失败");

                    }

                });

            })

            $("#btnView").click(function () {

                var _iid = $('input:radio[name=iid]:checked').val();;

                $.ajax({

                    type: "get",

                    url: "/api/Student/get/" + _iid,

                    dataType: "json",

                    success: function (data) {

                        name: $("#iid").val(data.ID);

                        name: $("#name").val(data.name);

                        sex: $("#sex").val(data.sex);

                        age: $("#age").val(data.age)

                    },

                    error: function () {

                        alert("获取失败");

                    }

                });

            })

            $("#btnEdit").click(function () {

                var _data = { name: $("#name").val(), sex: $("#sex").val(), age: $("#age").val() };

                $.ajax({

                    type: "put",

                    url: "/api/Student/Put/" + $("#iid").val(),

                    data: _data,

                    success: function (data) {

                        alert("修改成功");

                        GetList();

                    },

                    error: function () {

                        alert("修改失败");

                    }

                });

            })

        })

        function GetList()

        {

            $("#box_list").html("");

            $.ajax({

                type: "GET",

                url: "/api/student/GetList",

                dataType: "json",

                success: function (data) {

                    $.each(data, function (i, item) {

                        $("#box_list").append("<p><span><input type='radio' name='iid' value='" + item.ID + "' />" + item.ID + "</span><span>" + item.name + "</span><span>" + item.sex + "</span><span>" + item.age + "</span><span class='time'>" + item.timesAdd + "</span></p>")

                    });

                }

            });

        }

    </script>

</body>

</html>


常见问题:

如果在做修改和删除操作时报405错误(webapi delete Method Not Allowed),说明是iis把put和delete请求禁止了,需要在web.config中设置一下就ok了

    <modules>

      <remove name="WebDAVModule" />

    </modules>

    <handlers>

      <remove name="WebDAV" />

    </handlers>

  </system.webServer>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容