Get:

1、Get参数传递的本质是url字符串拼接;
2、url字符串长度受限制;
3、Get参数传递在Http请求头部传递,而不支持Request-Body传递;
4、Get类型的方法支持参数为基本类型,不支持实体类型;
5、Get类型的方法命名,应尽量采用“Get+方法名”的命名方式,且习惯性地在方法前加上[HttpGet特性];
6、实参与形参的匹配,遵循路由规则;
7、Get对应DB的Select操作,从这一点来理解,就知道为什么Http不支持实体对象传递的合理性了,因为一般情况,我们都是通过简单的字段查询信息(对应基本类型)

        //api/Person
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
} //http://localhost:27653/api/person/25
//[Route("GetID")]
[Route("api/Person/{id}")]//如果在这里设置了路由,那么就不会再执行webAPIConfig.cs中的路由了。
public string Get(int id)
{
return "vichin" + id;
}
//api/Person?phoneNum=186 //http://localhost:27653/api/person?phoneNum=25
//多个重载的时候,可以通过URL传参的形式来指定所要调用的方法。
public string GetPhoneNum(int phoneNum)
{
return phoneNum.ToString();
} //api/Person?name=vichin
public int Get(string name)
{
return name.Length;
}

Post:

1、Post参数传递本身是在Request-Body内传递,而Get参数传递本质是url拼接;
2、Post参数传递不是key/value形式,而Get参数是key/value形式;
3、Post传递参数时,无论是单个参数还是对象,均借助[FromBody] 特性(当然,某些情况去掉[FromBody] 特性也可把值传递进去,但为了规范化,尽量加上该特性);
4、Post没长度限制,而Get有长度限制(一般为1024b);
5、Post相对Get,较安全;
6、Post操作相当于DB的Insert操作;

        [HttpPost]
public string Post([FromBody]string value, string value1)//[FromBody] string value
{
return "Post 请求,value= " + value;
} [HttpPost]
public string PostDynamic([FromBody]Product product)//[FromBody] string value
{
return "PostDynamic 请求,value= " + product.ProductName;
} public string Put(int id, [FromBody] string value)//只有有一个参数用FromBody来修饰
{
return "Put 请求,value=" + value + ",id=" + id;
}
public string Delete(int id)
{
return "Delte请求, id:";
}

如果使用Post请求,那么就需要每个方法都声明一个参数对应的类(即使只有一个参数),参数前标注[FromBody],参数少的话麻烦,如果使用Get请求,那么都可以,但是需要注意防范缓存(HttpClient,ajax等需要禁用掉缓存)。

            $("#btn").click(function () {
$.ajax({
type: "Post",
url: "http://localhost:27653/api/person",
data: { "": "value" },//post请求,不需要key
success: function (res) {
alert(res);
},
error: function (msg) {
alert(msg.responseText);
}
});
}); //GET请求可以在url传参也可以将data中,已KEY:VALUE的形式进行传参。(其实在Chrome中能够发现,最终也是变成了URL传参)
// $.ajax({
// type: "Get",
// url: "/api/Default/ProductDetails",
// data: { "productDetail": JSON.stringify({ "ProductName": "YaGao", "ProductCode": "JX80869", "ProductPrice": 40.5 }) }
// })
//}) //dynamic单个参数传递
$("#btn1").click(function () {
$.ajax({
type: "Post",
url: "http://localhost:27653/api/person",
data: { "ProductCode": "JX00036", "ProductName": "YaGao", "ProductPrice": 20.5 },
success: function (res) {
alert(res);
},
error: function (msg) {
alert(msg.responseText);
}
});
}); var list_ProductDetail = [
{ "ProductCode": "JX00031", "ProductName": "ToothPaste", "ProductPrice": "20.5" },
{ "ProductCode": "JX00032", "ProductName": "ToothBrush ", "ProductPrice": "18.9" },
{ "ProductCode": "JX00033", "ProductName": "Pen", "ProductPrice": "199.9" },
{ "ProductCode": "JX00034", "ProductName": "computer", "ProductPrice": "15000.5" }
] $.ajax({
type: "Post",
contentType: 'application/json',
url: "/api/Default/PostParamToProducts",
data: JSON.stringify(list_ProductDetail)
}); var arr = ["a", "b", "c", "d"];
data: JSON.stringify(arr)

其他的操作如put delete大体上与post请求差不多。

路由:

    public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services // Web API routes
config.MapHttpAttributeRoutes();//特性路由 config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}

如果在路由中配置了action(routeTemplate: "api/{controller}/{action}/{id}"), MVC风格的路由。那么请求的网址将会是api/person/GetName/id。

//路由前缀
[RoutePrefix("api/Product")] //重写路由前缀
[Route("~/api/authors/{authorId:int}/books")]

 路由约束

约束 描述 示例
alpha 匹配大写或小写字符 (-z、 A-Z) {x: alpha}
bool 匹配一个布尔值。 {x: bool}
datetime 匹配项DateTime值。 {x: datetime}
decimal 匹配十进制值。 {x:decimal}
double 与 64 位浮点值匹配。 {x:double}
float 与 32 位浮点值匹配。 {x: float}
guid 匹配的 GUID 值。 {x: guid}
int 与 32 位整数值匹配。 {x: int}
length 与具有指定长度或长度的指定范围内的字符串匹配。 {x:length(6)} {x:length(1,20)}
long 与 64 位整数值匹配。 {x: 长时间}
max 匹配一个整数,其最大值。 {x:max(10)}
maxlength 与最大长度的字符串匹配。 {x:maxlength(10)}
min 匹配一个整数,其最小值。 {x: min(10)}
minlength 与最小长度的字符串相匹配。 {x: minlength(10)}
range 一个整数值的范围内的匹配项。 {x: range(10,50)}
正则表达式 与正则表达式匹配。 {x:regex(^\d{3}-\d{3}-\d{4}$)}
将多个约束应用于参数,用冒号分隔。

[Route("users/{id:int:min(1)}")]
public User GetUserById(int id) { ... }

先认真 后授权。使用Anonymous 可以忽略身份认证

asp.net webAPI的更多相关文章

  1. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  2. ASP.NET WebApi OWIN 实现 OAuth 2.0

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...

  3. Asp.Net WebApi核心对象解析(上篇)

    生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...

  4. ASP.NET WebApi 文档Swagger深度优化

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明博客园蜗牛原文地址,cnblogs.com/tdws   写在前面 请原谅我这个标题党,写到了第100篇随笔,说是深度优化,其实也并没有什么深度 ...

  5. ASP.NET WebApi 文档Swagger中度优化

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws   写在前面 在后台接口开发中,接口文档是必不可少的.在复杂的业务当中和多人对接的情况下,简 ...

  6. Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4

    Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4 Building O ...

  7. ASP.NET WEBAPI 的身份验证和授权

    定义 身份验证(Authentication):确定用户是谁. 授权(Authorization):确定用户能做什么,不能做什么. 身份验证 WebApi 假定身份验证发生在宿主程序称中.对于 web ...

  8. Enable Cross-Origin Requests in Asp.Net WebApi 2[Reprint]

    Browser security prevents a web page from making AJAX requests to another domain. This restriction i ...

  9. 为Asp.net WebApi 添加跨域支持

    Nuget安装包:microsoft.aspnet.webapi.cors 原文地址:https://www.asp.net/web-api/overview/security/enabling-cr ...

  10. 使用Asp.net WebAPI 快速构建后台数据接口

    现在的互联网应用,无论是web应用,还是移动APP,基本都需要实现非常多的数据访问接口.其实对一些轻应用来说Asp.net WebAPI是一个很快捷简单并且易于维护的后台数据接口框架.下面我们来快速构 ...

随机推荐

  1. CSS用户界面样式之cursor/outline/resize

    1. 鼠标样式cursor 检测鼠标指针在对象上移动的鼠标指针采用何种系统预定于的光标形状 常用属性: default 小白 hands小手 /pointer move移动 text文本 2. 轮廓 ...

  2. Category VS Extension 原理详解

    (一)Category 1.什么是Category? category是Objective-C 2.0之后添加的语言特性,别人口中的分类.类别其实都是指的category.category的主要作用是 ...

  3. 14.SpringMVC核心技术-类型转换器

    类型转换器 在前面的程序中,表单提交的无论是 int 还是 double 类型的请求参数,用于处理该请求 的处理器方法的形参, 均可直接接收到相应类型的相应数据,而非接收到 String 再手工转换. ...

  4. PPT 设置幻灯片母版

    现在我设计了一个PPT背景,我想新建幻灯片的时候,直接就是以这个背景展现,并把这个背景作用于左右的幻灯片. 1.选中第二页幻灯片,CTRL + C 复制一下 2.点击视图,幻灯片母版,背景样式,点击下 ...

  5. linux程序对比

  6. STM32TIM定时器的影子寄存器

    1.简介 在STM32基本定时器的PSC预分频寄存器和ARR自动装载寄存器都有影子寄存器. 我们可以看到基本定时器功能框图上对应的寄存器有影子~ 2.功能 影子寄存器的存在起到一个缓冲的作用. 设置影 ...

  7. 关于rtos中任务切换时的程序流程

    今天和一个小伙伴讨论了一下基于cortex-m3内核的RTOS在任务切换时的程序流程,小伙伴说国内某搜索引擎都搜不到这类的信息,所以我才打算写下来,硬件平台是stm32f1​. 这里的切换有两种情况: ...

  8. 四:MVC之LINQ方法语法

    linq 查询 有两种语法  ,前面我们说了一种,接下来说方法语法(我读着一直很绕口) 查询语法,方法语法 ------------------------以下文字都是复制-------------- ...

  9. linux——在windows上搭建linux练习环境

    程序员自己研究——java-linux-php——环境搭建 需要首选准备一个linux环境. 1,可用安装一个虚拟机:VMware虚拟机 2,安装一个VMware大约5分钟左右. 3,截止目前2019 ...

  10. ZOJ 4097 Rescue the Princess 边双缩点+LCA

    给你一个图和三个点U,V,W  问你是否存在从U到V和从U到W的两条边不相交路径 先边双缩点 再每个连通分量搞LCA 最后LCA判 #include<bits/stdc++.h> usin ...