ASP .NET - Web Api

假设有个Web Api 的路由设置

config.Routes.MapHttpRoute(
    name: "Agent4App_Api",
    routeTemplate: "api/AreaName/{controller}/{action}",
    defaults: new { namespaceName = new[] { "UJia.Areas.AreaName.Controllers" } }
);

 

// 不加 Get 头和 [HttpGet] 声明的
// 默认都使用 Post 传输, Get 无效
// 默认响应 Uri 中参数
public ResponseResult A(string a)
{
    return Success();
}

 

// Get 获取多个简单参数应该是没问题的 (没测试过)
//
Get 方法不能加[FormBody], 否则不能触发, 但取到恒为 null // Get 方法不加 [FormUri] 时, 能获取简单数据, 不能获取复合数据 // Get 方法加 [FormUri] 时, 能获取简单数据和复合数据 // Get 方法 使用 Get 开头命名和 [HttpGet] 效果完全相同 public ResponseResult GetD([FromUri]House s) { return Success(); }

 

// 不使用特性和动词命名的方法默认以 Post 传输
// 使用了 [FromBody] 则数据必须在 body 传输, 而且只能为一个复合类型参数, 要传输简单类型的看下文
// 使用了 [FromUri] 则数据必须在 Url 里传输, 可为符合类型或者简单类型
// 不使用 [FromBody] 和 [FromUri] 的时候, 可以在 Uri 中传输简单类型, 可以在 Body 中传输复合类型
public ResponseResult PostA(string s)
{
    return Success(s);
}

 

但是有个大坑: 如果使用了 Post  也加了 [FromBody]

又传了1个简单类型的参数, 那很抱歉, 后台获取的值肯定是空

 $.ajax({
    type: "POST",
    url: "http://172.28.20.106:8002/api/users/addid",
    data: {"value":"1"}
}).success(function (res) {
    console.log(res);
}).error(function (xhr, status) {
    console.log(xhr);
});

解决办法是

当只有一个参数并且为简单类型的时候,

1. data: {"" : "1" }  //忽略参数名

2. data: "=1"         //加上=号, 并且去掉花括号

Post 不能传输多个参数, 只能并成一个对象来传输 

 

 

[HttpGet] 特性 和 Get 命名, [HttpGet] 优先级大

 

posted @ 2017-06-16 16:25  `Laimic  阅读(183)  评论(0)    收藏  举报