如何传递参数到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则会抛出错误。

如何传递参数到web api2

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.asaxApplication_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}",