Web API 入门 一
2017-11-02 16:28 糯米粥 阅读(640) 评论(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