asp.net webAPI
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的更多相关文章
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- ASP.NET WebApi OWIN 实现 OAuth 2.0
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...
- Asp.Net WebApi核心对象解析(上篇)
生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...
- ASP.NET WebApi 文档Swagger深度优化
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明博客园蜗牛原文地址,cnblogs.com/tdws 写在前面 请原谅我这个标题党,写到了第100篇随笔,说是深度优化,其实也并没有什么深度 ...
- ASP.NET WebApi 文档Swagger中度优化
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 写在前面 在后台接口开发中,接口文档是必不可少的.在复杂的业务当中和多人对接的情况下,简 ...
- 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 ...
- ASP.NET WEBAPI 的身份验证和授权
定义 身份验证(Authentication):确定用户是谁. 授权(Authorization):确定用户能做什么,不能做什么. 身份验证 WebApi 假定身份验证发生在宿主程序称中.对于 web ...
- 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 ...
- 为Asp.net WebApi 添加跨域支持
Nuget安装包:microsoft.aspnet.webapi.cors 原文地址:https://www.asp.net/web-api/overview/security/enabling-cr ...
- 使用Asp.net WebAPI 快速构建后台数据接口
现在的互联网应用,无论是web应用,还是移动APP,基本都需要实现非常多的数据访问接口.其实对一些轻应用来说Asp.net WebAPI是一个很快捷简单并且易于维护的后台数据接口框架.下面我们来快速构 ...
随机推荐
- Python打
.智能识别图片物体.这步是智能垃圾分类的魔法核心.原理是人工智能会根据打上标签的海量图片来识别新的图片所归属的分类标签.好奇的读者可能会问,我没学过深度学习啊?我也不会训练模型,怎么办? python ...
- Webpack4 splitChunks配置,代码分离逻辑
博客不知道啥时候写的了,一直在草稿箱没写完,突然感觉今年过去大半了,又没怎么写博客.写写完,有始有终 1.代码分离升级 原来项目代码分离是通过下面的配置,基于bundle-loader插件,通过rou ...
- Innosetup设置控制面版中的名称显示和图标
//设置控制面板中程序图标UninstallDisplayIcon={app}\logo.ico //设置控制面板中程序的名称Uninstallable=yesUninstallDisplayName ...
- gulp 实现sass自动化 ,监听同步
实现功能 监听scss文件 sass自动化 准备条件 1 .安装gulp npm init ---->一直enter,会在当前目录下生成一个package.json文件,记录安装的依赖模块 ...
- ARMA(p,q)模型数据的产生
一.功能 产生自回归滑动平均模型\(ARMA(p,q)\)的数据. 二.方法简介 自回归滑动平均模型\(ARMA(p,q)\)为 \[ x(n)+\sum_{i=1}^{p}a_{i}x(n-i)=\ ...
- SSH配置(同一服务器不同用户)
一.cxwh用户ssh免密登陆至xtjk用户 1.cxwh用户执行 ssh-keygen -t rsa -N "" -f /home/cxwh/.ssh/id_rsa cp /ho ...
- 【Day4】2.详解Http请求协议
Http请求协议
- STM32L15x——ADC采集DMA数据只第一次正确(已解决)
前提:我用的芯片是STM32L系列,可能对其它STM32系列不完全适用,仅供参考! 一.问题描述 我在使用DMA方式读取单ADC单通道采集的数据时,发现只能正确的采集一次数据,后来的就一直与第一次的相 ...
- 不重启linuxVMWare虚拟机添加虚拟光驱、硬盘
方法/步骤1: VMware找到要添加虚拟光驱位置,先右击点击设置,如图所示: 步骤2: 出现此界面之后点击添加: 步骤3: 直接点击下一步,如下图所示: 点击完成,天机硬盘就完毕了. 磁盘添加完成, ...
- linux基础4-压缩及其相关的命令
一 压缩的原理以及gzip.bzip2.tar三个命令的: Linux下文件的压缩与打包 二 zip.zipinfo.unzip: zip:压缩成.zip文件 zipinfo:列出压缩文件信息