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. 每日一句 Linux, 持续精进

    每日一句 Linux, 持续更新 2019.12.10 1.远程登录 linux 服务器.首先要按照ssh(win10默认是安装了的).命令行窗口,使用 ssh 登录名@serverIp,之后输入密码 ...

  2. $.proxy的使用

    $.proxy()是jquery的一个方法.是一个改变this指向的方法. 在某些情况下,我们调用Javascript函数时候,this指针并不一定是我们所期望的那个.例如: //正常的this使用 ...

  3. Win7系统不能拖动文件夹的问题怎么解决?

    一般情况下,如果我们想要在电脑中移动文件夹,可以采用剪切复制粘贴或者按住鼠标左键拖动的方式来实现,但有些Win7系统用户反映文件夹会出现不能移动的情况,这是怎么回事呢?下面好系统U盘启动就为大家介绍一 ...

  4. Kubernetes的初始化容器initContainers

    initContainers是一种专用的容器,在应用程序容器启动之前运行,可以包括一些应用程序镜像中不存在的实用工具和安装脚本,可以完成应用的必要数据初始化等工作.总的来说就是在正式的容器启动之前做一 ...

  5. java 中操作字符串都有哪些类?(未完成)它们之间有什么区别?(未完成)

    java 中操作字符串都有哪些类?(未完成)它们之间有什么区别?(未完成)

  6. Map的使用及遍历方式

    Java中Map遍历的四种方式 如果同时需要key和value推荐使用entrySet(第一种): 如果只是获取key,或者value,推荐使用keySet或者values方式(第二种): 如果需要在 ...

  7. 算法9-----输出全排列(递归)---移除K个数,剩下最小数。

    1.题目:给定一个字符串,输出所有的字典序. 如: 输入字符串:'ac',输出:['ac','ca'] 输入字符串:‘abc' ,输出:['abc','acb','bac','bca','cab',' ...

  8. 低级键盘钩子,在WIN7以上版本的问题

    最近在项目用到低级键盘钩子.发现一个很奇怪的事情,在开发环境和测试环境下都正常运行的键盘钩子, 到了现场环境,总是偶发性出现 键盘钩子不能用了,而且退出时产生1404 错误. 后经过阅读MSDN 的R ...

  9. 关于SendMessage和PostMessage的理解的例子

    对于SendMessage 和 PostMessage 平时口头的解释是 SendMessage 发送消息后等待返回, PostMessage 发送消息后立即返回 . 但是这样解释还是不具体,什么叫等 ...

  10. Spring Boot 跨域访问

    如何在 Spring Boot 中配置跨域访问呢? Spring Boot 提供了对 CORS 的支持,您可以实现WebMvcConfigurer 接口,重写addCorsMappings 方法来添加 ...