web api初学

Posted 你爱我像谁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web api初学相关的知识,希望对你有一定的参考价值。

据说web api的作用和wcf的一样,只是比wcf更简单而已,具体如何我也不清楚,毕竟不是做学术研究的,我只是通过简单的例子来学习web api。能做的只需要知其然,不必管其所以然。当然有兴趣的可以去研究。

1、VS2013建立一个asp.net MVC4 web的应用程序

 可以看到这个项目比一般的MVC项目多了几个文件夹,最主要的是控制器里面多了一个Values控制器,而且没有相应的视图。这也是与MVC的不同,主要是没有视图。这个Values控制器继承的是ApiController而不是Controller,这也是一个不同的地方

2、看看webapiconfig文件,这里设置了api的访问路由

 

3、WCF主要提供一个对数据增删改查的服务,那么作为它的瘦身版的web api也是如此。首先来看看这个Values控制器,系统自动提供了几个函数,首先看看两个GET函数,只是用于查询数据的。

// GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }

 运行程序,在地址栏后面加上/api/values,可以看到程序返回的数据。至于为什么是xml格式的数据,这里就不讨论了,只需要知道我通过一个url就能访问Values控制器中get函数返回的数据。但是有两个get函数,为什么调用的是第一个。那是因为url能匹配的路由是DefaultApi,而且url中没有提供参数,所以就调用了第一个get函数。如果在地址栏后面加上/api/values/5的话,就能调用有参的get函数了。

控制器里面还有其他的函数,为什么这里要调用get函数而不是其他的。那是因为,在api中,所有用get方式请求的函数,都必须以get开头,否则就会报错:请求的资源不支持 http 方法“GET”。如果吧这两个get函数改一下名称,不以get开头,那么同样的url就没法访问数据了。但是不可能让所有的函数都以get开头吧,解决的方法就是对函数添加[HttpGet]约束,这样就可以用原来的url访问到数据了。那么问题又来了,如果有多个[HttpGet]修饰的无参函数,仍然以上面的url来访问,这时候又得报错了,因为系统发现可调用的函数不唯一,不知道该调用谁。这个时候我们就需要配置路由,定义更精确的url来访问函数了

4、webapiconfig文件,然后对values控制器的get函数修改下。

运行程序

5、web api是简单版的wcf,而wcf在完成后,是需要发布到服务器上,在使用的时候需要通过引入服务才能使用,而且还需要配置终结点。api也同样需要发布到服务器上,但是在用的时候只需要通过网址就能使用了,不需要去添加引用,配置复杂的终结点。下面就通过例子来看看如何在其他项目上调用web api

6、在解决方案中添加一个类库项目,用这个类库项目来模拟数据库。在项目中添加如下两个类,用来模拟数据源

public class SiteSource
    {
        public IList<Site> DateSource()
        {
            List<Site> sites = new List<Site>();
            sites.Add(new Site { SiteId = 1, Title = "test", Uri = "www.cnblogs.cc" });
            sites.Add(new Site { SiteId = 2, Title = "博客园首页", Uri = "www.cnblogs.com" });
            sites.Add(new Site { SiteId = 3, Title = "博问", Uri = "q.cnblogs.com" });
            sites.Add(new Site { SiteId = 4, Title = "新闻", Uri = "news.cnblogs.com" });
            sites.Add(new Site { SiteId = 5, Title = "招聘", Uri = "job.cnblogs.com" });
            return sites;
        }
    }

    public class Site
    {
        public int SiteId { get; set; }
        public string Title { get; set; }
        public string Uri { get; set; }
    }

在values控制器中添加如下函数

 /// <summary>
        /// 查询指定位置开始指定数量的数据
        /// </summary>
        /// <param name="index"></param>
        /// <param name="num"></param>
        /// <returns></returns>
        [HttpGet]
        public IEnumerable<Site> SearchSites(int index,int num)
        {
            SiteSource s = new SiteSource();
            return s.DateSource().Skip(index).Take(num).ToList();
        }

     /// <summary>
     /// 根据title来查询
     /// </summary>
     /// <param name="t"></param>
     /// <returns></returns>
        [HttpGet]
        public Site SearchSites(string t)
        {
            SiteSource s = new SiteSource();
            Site sit= s.DateSource().Where(o => o.Title == t).Single();
            return sit;
        }

7、在解决方案中再建一个MVC项目,通过这个项目来调用webapi实现数据的增删改查。建立好必要的控制器和视图,这里的控制器最好不要命名为home,因为它与webapi项目中的控制器同名了,这会导致待会在运行的时候报错。下面分别是控制器和视图中的代码

public class WebController : Controller
    {
        //
        // GET: /WebApi/

        public ActionResult Index()
        {
            IList<Site> s = getObjByTitle();
            return View(s);
        }

        private IList<Site> getObjByTitle()
        {
            HttpClient httpClient = new HttpClient();
            //GET方式去调用webapi
            var responseJson = httpClient.GetAsync("http://localhost:6972/api/values/SearchSites?t=test")
                .Result.Content.ReadAsStringAsync().Result;

        Site site = JsonConvert.DeserializeObject<Site>(responseJson);
        IList<Site> sites = new List<Site>();
        sites.Add(site);

       return sites;
        }

    }
@using Model;
@model IList<Site>
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
@{
    foreach (Site s in Model)
    {
        <h2>@s.Title</h2>
        <h3>@s.Uri</h3>
    }
}

 

8、准备运行程序,这个时候需要同时运行两个项目,除了类库以外的两个项目,在解决方案上右键,选择属性

运行,结果:

可以看到网页上出现了我想要的效果,调用是成功的。

与wcf比,webapi的优势是很明显的,首先一个,在调用的时候就不需要在项目中添加服务引用,直接一个网址搞定。其次,因为没有添加引用,项目和webapi就完全没有任何关联,也就是解耦了,那个网址,说白了就是个字符串,完全可以写到配置文件中去。然后,webapi的测试也很方便,只需要一个网址就可以测试,当然这里肯定涉及到了访问的安全机制,这不是本文讨论的范围。

还有几个疑问,webapi的访问方式有哪几种,如何实现数据的增删改,上面通过api获得的数据为什么是json格式,还能有其他格式吗。这些下回再讨论。

 

以上是关于web api初学的主要内容,如果未能解决你的问题,请参考以下文章

从 url 中提取音频片段并使用纯 Web Audio API 播放

web api初学

从WEB API向R获取JSON-这里是初学者

56个PHP开发常用代码

初学者的Api测试技巧!值得收藏!

初学者的API测试技巧