赞
踩
web应用程序的第三方数据接口服务,提供了存储各种信息,访问不同的数据库的服务,可以对接各种客户端(浏览器、移动设备[一般都使用web api]),构建http服务的框架
web api 特点 |
---|
分布式开发,减轻了服务器的负担 |
跨语言,跨平台 |
功能复用,数据共享 |
web api 多用于基于 http请求的服务应用,构建外部、第三方服务的请求
Web Service 格式定义固定好 ,一般做内部服务的使用 、基于soap协议,数据格式是xml;只能部署在iis上
Web Service | web api |
---|---|
** 一般做内部服务的使用 ** | ** 构建外部、第三方服务的请求(移动端服务)** |
基于soap协议,数据格式是xml | 返回数据多样 |
只能部署在iis上 | 可以部署在iis或应用程序上 |
不方便调试 | 开源,可以直接进行调试 |
mvc 倾向于数据展示;主要用于构建网站
web api 倾向于数据传递;非常构建移动客户端服务 数据交互/传输,分布式开发
mvc可以做到的 web api都能做到,不过web api 更倾向数据交互/传输
MVC | Web API |
---|---|
主要用于数据展示,用来构建网站 | 只关注于数据,适合构建移动客户端服务 |
不支持 | 支持Self Host |
通过控制器的方法名 表达动作 | 通过http verb 表达不同动作(CRUD) |
System.Web.Mvc命名空间下 | 内建于ASP.NET System.Web.Http命名空间下 |
api/控制器名称/参数
get / post ?根据方法命名的开始 是以【get开头就被判断为get请求】
(put 修改;delete 删除)
mvc 、web api 等都可以遵循 RESTful 风格架构(没有明确的定义规范)
mvc:
web api :
web api 风格与mvc 类似 创建好的项目 可以通过 **App_Start 下的WebApiConfig.cs **区别
创建web api 的控制器
web api 所继承的基类 ApiController
web api 中判断方法的请求类型 根据自定义的方法名的开头进行判断,以哪种请求开头就被判断成哪种请求
GetList (get请求)[查询]
PostData (post请求) [添加]
PutData(put请求) [修改]
DeleteData (delete请求) [删除]
也可以在方法前指定特性
[HttpPost]、[HttpGet]、[HttpPut]、[HttpDelete] 等
因为web api 的路由规则为:api/控制器名/参数
调用时 不指定方法名 根据请求类型 及 参数来判断 调用方法
但也可以 通过修改路由 规则/添加路由特性 来指定 路由链接
在默认的路由规则下
如果:Get(string pID,string pName)
Get(int pID,string pName)
这两个重装方法同时存在,那么通过参数请求该方法时将会产生异常
ajax调用: 需要配置跨域
get 的参数可以 通过data 传递 也可以直接拼接在链接上
public IHttpActionResult Getjson(int id) { PaperTypes ptinfo = db.PaperTypes.Find(id); return Json<PaperTypes>(ptinfo); } //调用 $.ajax({ type: "get" , url: "https://localhost:44350/Paper/GetPaperList" , data: { id:id } , dataType: "json" , success: function (res) { console.log(res) } })
//web api
//get 获取实体模型 1 要给参数前添加特性[fromuri]
public string Getstring([FromUri]Tb_GoodsInfo tg)
{
return tg.GoodsName;
}
//调用
//ajax get 的简写
//get传递实体模型1 直接传递实体模型 名称要与实体模型的名称相同
$.get(
"https://localhost:44358/api/APIC", { GoodsName: "商品1" }, function (res) {
alert(res)
}
)
//get 获取实体模型2
public string Getstring(string tg)
{
Tb_GoodsInfo tgi= JsonConvert.DeserializeObject<Tb_GoodsInfo>(tg);
return tgi.GoodsName;
}
//调用
//get传递实体模型2
var data = { GoodsName: "商品1", MemberPrice:18 };
$.get(
"https://localhost:44358/api/APIC", { tg: JSON.stringify(data) }, function (res) {
alert(res)
}
)
public IHttpActionResult PostAEdd(PaperTypes pt) { int n = 0; try { db.PaperTypes.Add(pt); n = db.SaveChanges(); } catch (Exception) { n = 0; } return Ok<int>(n); } //调用 名称与模型中相同 后台接口是直接使用模型接收 $.ajax({ type: "post" , url: "https://localhost:44350/api/Paper" , data: field //json格式 {k:v} , dataType: "json" , success: function (res) { console.log(res) } })
//post2 使用动态模型接受 Convert.ToString()转换字符串 之后反序列化 public string PostGords(dynamic obj) { string name =obj.id; string p = Convert.ToString(obj.tg); Tb_GoodsInfo tgi = JsonConvert.DeserializeObject<Tb_GoodsInfo>(p); //db.Tb_GoodsInfo.ToList(); return "名称:" + name + ",价格:" + tgi.GoodsName+":"+tgi.MemberPrice; } //调用 //post 序列化传递模型 名称与模型中不相同(多添加数据等) 后台接口是dynamic 类型接受 var data = { GoodsName: "商品1", MemberPrice:18 }; $.ajax({ type: "post", url: "https://localhost:44358/api/APIC", data: JSON.stringify({ tg:data,id:"ssss1" }), contentType: "application/json", dataType: "json", success: function (res) { alert(res) } })
put 使用方法和post 相似 同样支持[FromBody],同样可以使用dynamic
//put public IHttpActionResult PutAEdd(PaperTypes pt) { int n = 0; try { db.Entry<PaperTypes>(pt).State = System.Data.Entity.EntityState.Modified; n = db.SaveChanges(); } catch (Exception) { n = 0; } return Ok<int>(n); } //调用 $.ajax({ type: "put" , url: "https://localhost:44350/Paper/GetPaperList" , data: { id:id } , dataType: "json" , success: function (res) { console.log(res) } })
delete 使用方法和post 相似
//delete 需要在接受参数的时候添加[FromBody]特性 public int DeletePaperType([FromBody] int id) { try { PaperTypes pti = db.PaperTypes.Find(id); db.PaperTypes.Remove(pti); return db.SaveChanges(); } catch (Exception) { return 0; } } //调用 $.ajax({ type: "Delete" , url: "https://localhost:44350/api/Paper" , data: { id: id } , dataType: "json" , success: function (res) { console.log(res) } })
public void Getstring()
{
//wei api 中虽然可以定义void 无返回值类型的方法
//但是在调用时 ajax的success中不会得到返回值
//并且会返回 http 状态码204 提示客户端此请求没有返回值
}
public IHttpActionResult GetPaperList()
{
List<PaperTypes> ptlist = db.PaperTypes.ToList();
return Json<List<PaperTypes>>(ptlist);//返回泛型集合
}
public IHttpActionResult Getjson(int id)
{
PaperTypes ptinfo = db.PaperTypes.Find(id);
return Json<PaperTypes >(ptinfo);
}
public IHttpActionResult Getjson()
{
var info = new
{
name = "zss",
age = 18
};
return Json<dynamic>(info);
}
public IHttpActionResult Getjson()
{
return Ok<string>("1");
}
public string Getstring()
{
return "没有参数的get";
}
考虑安全性会有同源策略
调用接口一般都在不同项目下,出于安全考虑限制跨域请求
CORS全称Cross-Origin Resource Sharing,中文全称跨域资源共享。
它解决跨域问题的原理是通过向http的请求报文和响应报文里面加入相应的标识告诉浏览器它能访问哪些域名的请求。
WebClient是Java中一个HTTP客户端库,也可以用于发送HTTP请求和接收HTTP响应,并且提供了一些高级功能,如请求头定制、请求方法定制等。
HttpClient是Java中的一个HTTP客户端库,可以用于发送HTTP请求和接收HTTP响应。使用HttpClient可以很方便地实现跨域请求,因为它提供了跨域支持。
服务器端代码[接口]:
[Route("Paper/GetPaperList")] public IHttpActionResult GetPaperList(int page, int limit, string SelName = "") { List<PaperTypes> ptlist = db.PaperTypes.ToList(); //模糊查询 if (!string.IsNullOrEmpty(SelName)) { ptlist = ptlist.Where(p => p.Name.Contains(SelName)).ToList(); } //layui表格展示 var pjson = new { code = 0, msg = "", count = ptlist.Count, //分页 data = ptlist.OrderByDescending(p => p.CreateTime).Skip((page - 1) * limit).Take(limit).ToList() }; return Json<dynamic>(pjson);//返回匿名类型 }
此处使用的是get请求的操作
get 请求 与 post 请求的区别就是传递 参数的方式
客户端代码[后台]:
public ActionResult GetList(int page,int limit, string SelName="") { //实现跨域操作,获取API 接口中的数据 //1.客户端对象实例化 HttpClient client= new HttpClient(); //2.请求头部添加请求的传输格式设置 "application/json" client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); //3.发送请求并获取(响应)结果 //发送get[异步]请求 可以直接将链接放入请求 string url = "https://localhost:44310/Paper/GetPaperList?page=" + page + "&limit=" + limit + "&SelName=" + SelName; HttpResponseMessage resMessage = client.GetAsync(url).Result; //只是一个响应结果,还需要处理 //将响应的数据序列化成字符串结果(返回的是json格式的字符串) var str=resMessage.Content.ReadAsStringAsync().Result; //再次反序列化出想要的结果(需要使用值的时候) //var obj= JsonConvert.DeserializeObject<dynamic>(str); //return Json(obj, JsonRequestBehavior.AllowGet); //此处我前台需要的直接是json格式字符串 就直接返回字符串 return Content(str); }
客户端代码[前台]:
例子使用的是layui的表格及分页
// 创建渲染实例 tableAll = table.render({ elem: '#test', id: 'test', url: '/PaperType/GetList', height: 'full-35', // 最大高度减去其他容器已占有的高度差 page: true,// 是否显示分页 limits: [5, 10, 15], limit: 5, // 每页默认显示的数量 cols: [[ { type: 'checkbox', fixed: 'left', align: 'center' }, { field: 'PaperTypeId', fixed: 'left', title: 'ID', sort: true, align: 'center' }, { field: 'Name', title: '试卷名称', align: 'center' }, { field: 'CreateTime', title: '创建时间', align: 'center', templet: function (res) { return formatterData(res.CreateTime) } }, { fixed: 'right', title: '操作', align: 'center', toolbar: '#barDemo' } ]] });
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。