.net WebApi

4 篇文章 0 订阅

webapi2:给前端提供数据的框架

Restful(语义)的数据提供方式:

Get(查)从服务器获取
Post(增)发送到服务器
Put(改)修改
Delete(删)删除
  • MVC控制器:Controller
  • API控制器:ApiController

返回值类型自动识别处理,可以返回对象和对象数组,列出成员

WebApiConfig.cs设置api的路由:

  • 路由name不能重复
  • routeTemplate不加api前缀会与MVC路由冲突
  • 没有默认值:api是用来传输数据的,没有默认数据一说

Restful(语义)方式传输数据,action方法需要带对应的关键字(get、post等),例如GetAddress()可以,Address()不行

简单数据(id,name等)可以用url传参,post、put提交对象数据需要data提交

非Restful风格:

  • 路由前缀[RoutePrefix("(控制器路径)")]为控制器下的每个方法添加一个内容为控制器路径的前缀

  • 需要自己指定处理类型,例[HttpPost] 手动定义路由名[Route("(方法路由名)")]

  • 完整示例:

[RoutePrefix("控制器路径")]
控制器:ApiController
{
         [HttpPost]//还有[HttpGet]等特性,注明此action只能通过POST方法调用
         [Route("方法路由名")]
         行为方法(类型 参数)
         {...}
}
  • 方法路由名与方法名不一定一致,以路由名为主
  • 行为方法的参数类型前可以加上[FromBody]限制,如:行为方法([FromBody]类型 参数)
[FromBody]

注明参数只能从Post请求体(body)中获取,FromBodyAttribute强制要求被其修饰的参数,必须是序列化后的实体成员。[FromBody]在一个方法中只能修饰一个参数。

  1. 如果客户端Content-Type是application/json, api接口如果是用单个对象做参数的时候,加或者不加[FromBody]都可以正常解析参数,但是接口是用对象列表做参数时候,则必须加[FromBody],否则读取不到参数
  2. 如果客户端Content-Type不是application/json,api接口必须加[FromForm],否则客户端调用接口会报400错误。
  3. 如果加上[FromBody],客户端Content-Type不是application/json,接口会报400错误。

WebAPI请求

对于前端页面发起的get/post请求作出相应的处理,前端使用JQuery发起异步请求实现数据调用

一、Get请求

通过url传参

1. 无参数的Get请求

一般的 get 请求我们可以使用 jquery 提供的 $.get() 或者 $.ajax({type:“get”}) 来实现,在url中是拼接在url最后的以?开始的部分
后台方法示例:

public 返回值类型 GetAction(){...}

返回值类型可以是基本数据类型,也可以是类、List集合等等

2. 传递一个参数的Get请求

通常我们需要传递参数只需要指定 ajax 方法的 data 属性即可: data:{“name”:“赵大宝”}
后台方法示例:

public 返回值类型 GetAction(string name){...}
3. 传递多个参数的Get请求

按照上面的方法,对于多个参数我们可以很容易就写出来: data:{“name”:“赵大宝”,“age”:12}
后台方法示例:

public 返回值类型 GetAction(string name,string age){...}

二、Post请求

通过RequestBody传参

1. 无参数的Post请求

我们可以使用 $.post() 或 $.ajax({type:“post”}) 来发起 post 请求
后台方法示例:

public 返回值类型 PostAction(){...}
2. 传递一个参数的 Post 请求

前端data不用key=value而是=value。将key设置为空,如data:{""="赵大宝"} ;或者传一个单纯的字符串由后台去解析,如data:'"name=张三,age=21"'用单引号包一个双引号,双引号里为字符串内容
后台方法示例:

public 返回值类型 PostAction([FromBody] string name){...}
3. 传递多个参数的Post请求

三种方法

前端:

$.ajax({
           url: "/api/student/poststudent",
           type: 'POST',
           data:JSON.stringify({ name: "张三", age: 21 }),//Json序列化一个对象,小括号中是一个对象,可以单独定义
           success:function () {
           },
           dataType: "json",
           contentType: "application/json"
       });
  1. 通过传递一个实体类对象

后端:

	public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    [HttpPost]
    public 类型 PostStudent(Student student)
    {
        //student.Age=21
        //student.Name="张三"
        ...
    }
  1. 通过dynamic动态类型

后端:

[HttpPost]
public 类型 PostStudent(dynamic student)
{
    var name = student.name;//name大小写与前端参数一致,var类型接收
    var age = student.age;
    ...
}
  1. JObject参数

后端:

[HttpPost]
public 类型 PostStudent(JObject student)
{
    var name = student["name"];
    var age = student["age"];
    ...
}

总结

Get请求与Post请求(以及其他请求方式)的根本原因是http协议以及浏览器规范对http请求传参的规定,从而体现出许多差异。.net WebApi的路由机制是通过模式匹配来进行的,可以自己定义一些路由模板或者启用特性路由,体现了该路由机制的灵活性

相关知识点
  1. .net WebApi路由机制
  2. .net WebApi模型绑定
  3. .net WebApi参数传递
  4. JQuery/Ajax发起请求
  5. Json
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值