如何传递参数到web api2
本文关键字:web api2 参数 何传递 | 更新日期: 2023-09-27 18:17:44
控制器签名:
public class UserAlertsController : ApiController
public IHttpActionResult Post(Guid id, List<long> users)
路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
邮差的要求:
http://localhost:50828/api/UserAlerts/4af3fee7-84ae-48fa-9215-45a00c35dbf
Content-Type application/json
[1,2]
通过上面的设置,我收到消息:
"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry
for parameter 'id' of non-nullable type 'System.Guid'"
我也使用标准的global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
谁能告诉我我哪里做错了
如果我把我的动作签名改为:
public IHttpActionResult Post(string id, long[] users)
然后它被正确绑定,但是如果id被更改为Guid则会抛出错误。
EDIT
你犯了一个错误,通过了4af3fee7-84ae-48fa-9215-45a00c35dbf
,它不是GUID,你应该通过4af3fee7-84ae-48fa-9215-45a00c35dbf6
。注意最后的6。
根据你原来的问题
问题是你的路由,你应该使用:"api/{controller}/{id}"
作为路由url模板。
你正在传递guid作为路由参数,但是你的路由与你使用的url不匹配。
打开WebApi.Config
并将默认路由更改为以下路由:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
还要确保您已在global.asax
和Application_Start
中注册了WebApiConfig
:
GlobalConfiguration.Configure(WebApiConfig.Register);
注:
默认情况下,Web API使用以下规则绑定参数:
如果参数是"simple"类型,Web API尝试从URI获取值。简单类型包括。net基本类型(int、bool、double等),加上TimeSpan、DateTime、Guid、decimal和string,以及任何带有可以从字符串转换的类型转换器的类型。
对于复杂类型,Web API尝试使用媒体类型格式化器从消息体中读取值。
您传递的GUID值在header中。您可以通过FromUri
属性指定希望从uri接收值:
public IHttpActionResult Post([FromUri]Guid id, List<long> users)
另一个问题是你有"api"部分在你的HTTP URL:
http://localhost:50828/api/UserAlerts/4af3fee7-84ae-48fa-9215-45a00c35dbf
当你的控制器在声明中缺少它时。要么从你的url中删除"api"部分,要么把它添加到你的路由中。
这:http://localhost:50828/UserAlerts/4af3fee7-84ae-48fa-9215-45a00c35dbf
或者在MapRoute
下修改url
:
url: "api/{controller}/{action}/{id}",