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. LeetCode:197.上升的温度

    题目链接:https://leetcode-cn.com/problems/rising-temperature/ 题目 给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日 ...

  2. Arcgis js之web墨卡托(3857)转经纬度坐标(4326)

    Arcgis js之web墨卡托(3857)转经纬度坐标(4326) 手动转化方法: function mercatorTolonlat(mercator){ var lonlat={x:0,y:0} ...

  3. 记一次线上dubbo服务超时和线程池满问题排查

    线上某dubbo服务A调用dubbo服务B的接口X方法,调用端A日志中出现了很多超时的情况,提供端B该接口X超时时间设置为60s: 查看提供端B的日志,报了很多线程池满的异常: Caused by: ...

  4. 【jekins】jenkins构建触发

    一.定时构建的语法 * * * * *(五颗星,中间用空格隔开)第一颗*表示分钟,取值0~59第二颗*表示小时,取值0~23第三颗*表示一个月的第几天,取值1~31第四颗*表示第几月,取值1~12第五 ...

  5. 原生js制作播放器

    以前 就想做一个播放器,一直没狠下心来,今天终于狠下心来,把这个做出来了(因为有点无聊) 做这个播放器  也百度了一下, 你叫我做,我肯定做不出来, 就算用jquery  我也做不出来. 以前也用过a ...

  6. JQuery初始加载时注册文本框失去焦点事件

    在JQuery初始加载时注册文本框失去焦点事件 $(function(){ $('#文本框ID').blur(function(){ //对文本框内容进行处理 }); });

  7. git的安装和简单使用

    目前windows版本的git有几种实现,但我们选择msysgit发行版,这是目前做得兼容性最好的. 下载地址: http://code.google.com/p/msysgit/downloads/ ...

  8. linux程序编译过程

    大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类 ...

  9. git diff 检查更新

    git diff 检查更新 git fetch #需要先 fetch git diff master..origin/master --name-only -- [path] #path:指定检查 可 ...

  10. .configurable:可配执行 .enumerble:枚举性 .writable:可读写性 .value:数据值

    configurable:控制属性能否被删除,只有当属性的configurable特性的值为true时,该属性才能够被删除. 默认值为false,即不可删除) var person = {}; Obj ...