将 int 直接发布到 Web api,无需模型类

Xar*_*mer 5 c# web-services asp.net-web-api

我是 C# 新手。我尝试使用 int 创建邮政服务。所有获取和发布服务都工作正常。

但是当我将参数传递给后期服务时,它始终为空。但创建一个类后它工作正常。我们可以直接将 int 传递给 service 还是我们必须为其创建一个模型类?

    [System.Web.Http.HttpPost]
    public IHttpActionResult GetUserByID(int id)
    {
        var user = userList.FirstOrDefault((p) => p.Id == id);
        if (user== null)
        {
            return NotFound();
        }
        return Ok(user);
    }
Run Code Online (Sandbox Code Playgroud)

但它总是发送 0 。但是当我创建一个类并将该 int 添加为属性时,它工作正常。

工作代码

    [System.Web.Http.HttpPost]
    public IHttpActionResult GetUserByID(data id)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        return Ok();
    }

   public class data
   {
       [Required]
       public int id { get; set; }
   }
Run Code Online (Sandbox Code Playgroud)

编辑

我的标题准确吗?

在此输入图像描述

Mat*_*ley 6

我认为你需要添加[FromBody]到参数:

[System.Web.Http.HttpPost]
public IHttpActionResult GetUserByID([FromBody]int id)
{
    var user = userList.FirstOrDefault((p) => p.Id == id);
    if (user== null)
    {
        return NotFound();
    }
    return Ok(user);
}
Run Code Online (Sandbox Code Playgroud)

根据文档:ASP.NET Web API 中的参数绑定

默认情况下,Web API 使用以下规则绑定参数:

  • 如果参数是“简单”类型,Web API 会尝试从 URI 获取值。简单类型包括 .NET 基元类型(int、bool、double 等),加上 TimeSpan、DateTime、Guid、decimal 和 string,以及带有可以从字符串转换的类型转换器的任何类型。
  • 对于复杂类型,Web API 尝试使用媒体类型格式化程序从消息正文中读取值。

它接着说:使用 [FromBody]

要强制 Web API 从请求正文中读取简单类型,请将 [FromBody] 属性添加到参数中

更新 - 开始[HttpPost]工作......

正如@Shahbaz 下面建议的那样,请确保您已将Content-Type标头设置为application/json,否则您将收到错误消息:

此资源不支持请求实体的媒体类型“文本/纯文本”。

另外,请确保您id请求正文中发布,例如1,而不是将包装在 JSON 对象中的 id 作为键/值对发布{ "id": "1" }

[HttpGet]最后- 考虑使用......

值得指出的是,因为您现在只是发送一条int获取一条记录,即使您可以使用它来工作[HttpPost],最好还是将其更改为[HttpGet]语义上正确的 - 您正在获取一条用户记录,并且不要实际上根本不需要发布任何内容。所以这样的事情可能会更好:

[System.Web.Http.HttpGet]
[Route("api/users/{id}")]
public IHttpActionResult GetUserByID(int id)
{
    var user = userList.FirstOrDefault((p) => p.Id == id);
    if (user== null)
    {
        return NotFound();
    }
    return Ok(user);
}
Run Code Online (Sandbox Code Playgroud)

然后将您的id请求 URL 放入,例如:

https://yourdomain/api/users/1
Run Code Online (Sandbox Code Playgroud)

上面的示例使用属性路由,它可以帮助您创建自己的自定义 URL 来定位您自己的 API 操作方法。