代码改变世界

Web API 入门 一

2017-11-02 16:28  糯米粥  阅读(633)  评论(0编辑  收藏  举报

因为只是是一个简单的入门。所有暂时不去研究web API一些规范。比如RESTful API

这里有个接收RESTful API的。RESTful API

 

什么是WebApi 看这里:http://www.cnblogs.com/guyun/p/4589115.html

 

我今天要做的。就是直接写api然后通过代码调用,毕竟我也刚入门。不搞那么复杂。

首先创建一个空的WebApi项目

在App_Start 文件夹下面可以看到WebApiConfig.cs类,打开看到

 

这是WebApi的路由规则

我们修改成。

是不要发现跟MVC很像了,通过controller和Action来映射到接口

 

接下来创建一个Product控制器。底层我有模拟(仓储)数据。这里就不说了

 

 

 

创建好了API。我把它部署在本地的IIS上。便于调试。部署后。访问http://127.0.0.1:8081/help (创建不是空的Api项目才有help路径)

可以看到我创建好的API列表

 

 

 

这样就可以根据这个地址来访问api了。现在试试。用WebClient访问 它在System.Net命名空间下

未来能看到是否访问成功。我会在api打个断点。

 public static void WebApiclient()
        {
            string url = "http://127.0.0.1:8081"; //目标url

            var product = new { Name = "Gizmo", Price = 100, Category = "Widget" };
            string json = JsonConvert.SerializeObject(product);
            byte[] postData = Encoding.UTF8.GetBytes(json);

            WebClient client = new WebClient();
            //设置请求头是json格式
            client.Headers.Add("Content-Type", "application/json");
            client.Headers.Add("ContentLength", postData.Length.ToString());
            byte[] responseData = null;
            string result = "";
            //post 同步方式 
            responseData = client.UploadData(url + "/api/product/getAll", "post", new byte[] { });
            result = Encoding.UTF8.GetString(responseData);
        }

因为这里getAll是不需要参数的。所以传new byte[] { }

先把webApi附加到进程

 

然后在测试项目上。调试。启动新实例

 

可以看到,已经进入了

 

看看返回结果:

 

这里返回的是json格式,因为给的 client.Headers.Add("Content-Type", "application/json"); 这是媒体类型

 

返回的是json格式了。那么就可以用Newtonsoft.Json反序列化了

 var array = JArray.Parse(result);
 var id = array[0]["Id"];

Newtonsoft还有一个功能,把json字符串转json对象

 var product = new { Name = "Gizmo", Price = 100, Category = "Widget" };
            string json = JsonConvert.SerializeObject(product);

            JObject jo = JObject.Parse(json);
            string name = jo["Name"];

参考:

http://www.cnblogs.com/ramantic/p/7700266.html

 

参考:

http://www.cnblogs.com/OleRookie/p/5721018.html

http://www.cnblogs.com/OleRookie/p/5721000.html

 

既然是json格式。那么可以反序列。创建一个实体类product

 

用JsonConvert 反序列化

 

同样用get方式也可以请求。需要把getAll 的标记[HttpPost] 去掉

 

当然。大部分都有参数的。比如

 

所有在传参数的的时候,用json的方式。json中的键能直接映射到produc中的属性中

现在修改上面的 测试代码。修改如下:

 

 

看看api。也直接映射成功了

 

 

有时候参数不确定。可以用dynamic类型。然后反序列化成对象

比如:CategoryOther(dynamic Name) 方法:

 

 

 

异步操作

 

 

 

上面参数好像都是传的json。那么如果api有这么一个接口呢

它接收一个字符串。然后返回已字符串,这里用了一个  FromBody特性

改动下上面的WebClient代码

 byte[] postData = Encoding.UTF8.GetBytes("90");

responseData = client.UploadData(url + "/api/product/getMessage", "post", postData);

 

请求看看结果,已经成功返回

 

如果是get请求。只需要在后面拼接 /api/product/getMessage?message=90

 

  WebClient请求API就这么多了。同样HttpClient也能访问API。至于哪个比较常用。我也不知道。哈哈

 

同样用HttpClient请求getMessage 方法

 

如果我们要调用这个方式呢,参数是类似MVC的ModelBinder

 

那改动下代码

 

运行看结果:已经映射成了

 

看看返回数据也有了

 

除了PostAsJsonAsync 方式。还可以用PostAsync方式

PostAsync方式有个HttpContent参数

 

 

这里用到

 StringContent content = new StringContent(json);
 content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

 

 

在网上看到别人这样写,也可以映射成功

 

 

WebApi默认是没有开启session。必须自己开启。在Global.asax中注册

 public override void Init()
        {
            //注册事件
            this.AuthenticateRequest += WebApiApplication_AuthenticateRequest;
            base.Init();
        }
        //开启session支持
        void WebApiApplication_AuthenticateRequest(object sender, EventArgs e)
        {
            //启用 webapi 支持session 会话
            HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
        }

 

参考:

http://www.cnblogs.com/CreateMyself/p/4827171.html

http://www.cnblogs.com/dudu/archive/2012/05/11/2495169.html

 

https://www.cnblogs.com/wangjiming/p/8378108.html