当前位置:   article > 正文

Web API 基础使用(.net)231225_,net web api

,net web api

web api

web应用程序的第三方数据接口服务,提供了存储各种信息,访问不同的数据库的服务,可以对接各种客户端(浏览器、移动设备[一般都使用web api]),构建http服务的框架

web api 优点

  1. 跨平台数据的传输,xml、json、html等多种数据,支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作
  2. 后台不需要json[]转换数据,因为Web API 可以自动转换
  3. web api 支持url路由, 【与mvc路由风格相似,但是路由规则完全不同(默认路由规则以api开头)】
web api 特点
分布式开发,减轻了服务器的负担
跨语言,跨平台
功能复用,数据共享

使用

  1. web api 可以调试、web service 不可以调试
  2. web api 倾向于第三方数据的服务、web service 倾向于内部数据
什么时候适合使用web api
  1. 需要接口,但是不需要SOAP 服务
  2. 一些简单的http服务
  3. 可能会被宽带限制的设备访问时
  4. 希望使用开源框架,可以自己调试和定义框架

web api 和 Web Service 区别

web api 多用于基于 http请求的服务应用,构建外部、第三方服务的请求
Web Service 格式定义固定好 ,一般做内部服务的使用 、基于soap协议,数据格式是xml;只能部署在iis上

Web Serviceweb api
** 一般做内部服务的使用 **** 构建外部、第三方服务的请求(移动端服务)**
基于soap协议,数据格式是xml返回数据多样
只能部署在iis上可以部署在iis或应用程序上
不方便调试开源,可以直接进行调试

web api 和 mvc 区别

mvc 倾向于数据展示;主要用于构建网站
web api 倾向于数据传递;非常构建移动客户端服务 数据交互/传输,分布式开发

mvc可以做到的 web api都能做到,不过web api 更倾向数据交互/传输

MVCWeb 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 的默认路由风格

mvc:
请添加图片描述web api :请添加图片描述

创建wei api

web api 风格与mvc 类似 创建好的项目 可以通过 **App_Start 下的WebApiConfig.cs **区别请添加图片描述
创建web api 的控制器请添加图片描述
请添加图片描述
web api 所继承的基类 ApiController

指定方法的请求类型(get、post、put、delete)

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)
这两个重装方法同时存在,那么通过参数请求该方法时将会产生异常

创建+调用方法
get (查询)

ajax调用: 需要配置跨域
get 的参数可以 通过data 传递 也可以直接拼接在链接上

  1. 普通数据
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)
    }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  1. 传递模型数据
  • 获取实体模型1
//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)
    }
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 获取实体模型2 利用序列化和反序列化 获取实体模型
//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)
    }
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
post(添加)
  • 直接使用模型接收
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)
    }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • post 动态模型接受
//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)
    }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
put(修改)

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)
    }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
delete(删除)

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)
    }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
web api 方法 返回值 类型
void 无返回值
 public void Getstring()
{
      //wei api 中虽然可以定义void 无返回值类型的方法
      //但是在调用时 ajax的success中不会得到返回值
      //并且会返回 http 状态码204 提示客户端此请求没有返回值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
IHttpActionResult
  • Json(T content)
    可以用来返回List泛型或者实体对象转换的Json格式数据
  1. 返回泛型集合
public IHttpActionResult GetPaperList()
{
    List<PaperTypes> ptlist = db.PaperTypes.ToList();
   
    return Json<List<PaperTypes>>(ptlist);//返回泛型集合
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 返回实体模型
public IHttpActionResult Getjson(int id)
{
    PaperTypes ptinfo = db.PaperTypes.Find(id);
    
    return Json<PaperTypes >(ptinfo);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 返回匿名类型
public IHttpActionResult Getjson()
{
    var info = new
    {
        name = "zss",
        age = 18
    };
    return Json<dynamic>(info);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • Ok(T content)
    返回基础数据类型,比如数字或者字符串
public IHttpActionResult Getjson()
{
    return Ok<string>("1");
}
  • 1
  • 2
  • 3
  • 4
  • NotFound
    没有找到记录
基础数据类型 int/string 等
public string Getstring()
{
    return "没有参数的get";
}
  • 1
  • 2
  • 3
  • 4

调用web api

考虑安全性会有同源策略
调用接口一般都在不同项目下,出于安全考虑限制跨域请求

配置 web API 的跨域方法
配置CORS跨域操作(在wei api 端操作)

CORS全称Cross-Origin Resource Sharing,中文全称跨域资源共享。
它解决跨域问题的原理是通过向http的请求报文和响应报文里面加入相应的标识告诉浏览器它能访问哪些域名的请求。

  1. 需要安装Nuget 包
    请添加图片描述2. 在 App_Start 下的WebApiConfig.cs 配置跨域操作
    请添加图片描述
    以下两种跨域操作通用,以mvc为例
WebClient方式(调用接口时跨域配置)

WebClient是Java中一个HTTP客户端库,也可以用于发送HTTP请求和接收HTTP响应,并且提供了一些高级功能,如请求头定制、请求方法定制等。
在这里插入图片描述

HttpClient方式 (调用接口时跨域配置)

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);//返回匿名类型
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

此处使用的是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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

客户端代码[前台]:
例子使用的是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' }
    ]]
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/935789
推荐阅读
相关标签
  

闽ICP备14008679号