【问题标题】:Post int directly to web api without model class直接发布 int 到 web api 没有模型类
【发布时间】:2018-01-30 13:30:46
【问题描述】:

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

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

    [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);
    }

但它总是发送 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; }
   }

编辑

我的标题准确吗?

【问题讨论】:

  • Content-Type 设置正确,我会删除 Accept-CharsetUser-Agent 因为它们不需要解决这个特定问题。更重要的是您在请求正文中发送的内容,您发送的对象是包含键/值对{ "id": "1" } 中的 id 还是仅包含 id,例如1(这是您应该发送的内容)- 也许将您发送的内容发布在上面屏幕截图的 Body 选项卡上。
  • 我都试过了,但我得到的所有原始数据类型都是 null 。我尝试将我的 id 更改为字符串并将它们转换为 int。把字符串也给他们的空了。
  • 我看不出id 怎么可能是null,它是一个int,它是一个值类型,如果没有明确设置,它至少会采用默认值0 ,确定吗?

标签: c# web-services asp.net-web-api


【解决方案1】:

我认为你需要在参数中添加[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);
}

根据文档:Parameter Binding in ASP.NET Web API

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

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

接着说:Using [FromBody]

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

更新 - 让 [HttpPost] 工作...

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

此资源不支持请求实体的媒体类型“text/plain”。

另外,请确保您在请求正文中发布只是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);
}

然后将您的id 放入请求网址中,例如:

https://yourdomain/api/users/1

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

【讨论】:

  • 我写的是同样的答案 :-)
  • 我还建议在请求中将 Content-Type 设置为 application/json,因为 web api 默认不支持 text/plain。
  • 我也试过了。我正在用邮递员测试它我应该设置什么标题来测试该服务。可能是标题错误
  • 获取服务正常工作我只是在学习。我认为我们不能将原始数据类型发送到 web api 。我说的对吗??
  • 问题已解决:首先我从标头中删除 Accept-charSet 和 UserAgent,而不是以原始形式发送数据,我使用 ?id=1 之类的参数添加了它,它工作正常
【解决方案2】:

通过如下的 Jquery 向 Web Api 发送数据:

function PostSth(fid){
  $.ajax({  
    url: apiBaseUrl + 'api/Controller/ActionMethod',  
    type: 'Post',  
    data:`'`+fid+`'`,
    contentType: "application/json; charset=utf-8",
    success: function (data) {         
        alert(data);

    },  
    error: function () {  
        alert('Error');  
    }  
 });
}

别忘了

data:`'`+fid+`'`,

上面。

并在后面的代码中做:

public string ActionMethod([FromBody]int fid)
{
     string result = string.Empty;
     //TODO: Your Code

    return result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2014-03-08
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多