【问题标题】:Pass json data to ASP.Net core 2 web api将 json 数据传递给 ASP.Net core 2 web api
【发布时间】:2020-06-26 12:53:38
【问题描述】:

我知道这个问题已经被问过好几次了,但是以前的解决方案都没有帮助我解决我的问题(实际上这似乎很简单)。 我只想将 Json 对象发送到我在控制器类中创建的 Post 方法。 这是我的控制器类中有趣的部分:

[Route("api/[controller]")]
public class CodeController : Controller
{
    [HttpPost]
    public void Post([FromBody] InfoNegozio value)
    {
       return;
    }
}

我保持简单,因为我只想正确设置值。 这是 InfoNegozio 类:

public class InfoNegozio
    {
        public int IdNegozio { get; set; }
        public string NomeNegozio { get; set; }
        public int AttesaStimata { get; set; }
        public DateTime UltimoAggiornamento { get; set; }
    }

这是用于向此 API 发送数据的代码:

var myData = { "IdNegozio": idNegozio, "AttesaStimata": tempoAttesa };
    $.ajax({
        url: "api/Code",
        type: "POST",
        contentType: "application/json",
        dataType: "json",
        data: JSON.stringify(myData)
});

jQuery代码只是调用了webapi控制器,value字段是一个非空的InfoNegozio对象,但是IdNegozioAttesaStimata字段总是0。

我可以要求我在 Razor 页面项目中使用控制器,并且我必须在 Startup.Configure 方法中添加这行代码才能使其工作(“它”是指另一个 webapi GET 方法)。

app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

有什么想法吗?

已编辑

通过使用邮递员,我发现了正常通话和不正常通话之间的区别。 用邮递员发布这个 json 是有效的:

{
    "IdNegozio": 1,
    "AttesaStimata": 36
}

不幸的是,使用 jquery,使用 JSON.stringify,我得到了这个(注意值上的双引号):

 {
     "IdNegozio": "1",
     "AttesaStimata": "36"
 }

这行不通! Json stringify 是否与 .net core Web Api 不兼容?是否有可能没有一种干净的方法可以使这两个库一起工作?

编辑 2

我最终手动构建了 json,强制 jquery 发送“我的版本”,所以我的 js 代码现在正在寻找:

var myData = '{ "IdNegozio": '+idNegozio+', "AttesaStimata": '+tempoAttesa+' }';
    $.ajax({
        url: "api/Code",
        type: "POST",
        contentType: "application/json",
        dataType: "json",
        data: myData
});

无论如何我不喜欢这个解决方案,因为我似乎没有使用正确的方法来构建 json 对象,所以任何更智能的解决方案都将不胜感激。

【问题讨论】:

  • 只是为了确认这是一个服务器端问题,您是否尝试过使用 Postman 之类的工具发布 JSON?如果你有同样的问题,那么至少你肯定知道它是服务器端的,而不是你的 jQuery 做的奇怪的事情。如果您发布字符串和日期时间字段,它们是否也为空/空?
  • @BryanLewis:在用 Postman 测试后,我用一些细节编辑了帖子
  • 好的,让我澄清一下问题是什么,以便我可以尝试提供帮助。您在客户端应用程序中的 jQuery 代码确实达到了正确的端点,对吗?如果是,那么我们可以假设这不是路由问题。听起来您的问题是控制器在绑定/反序列化 InfoNegozio 对象时为您的属性设置默认值。两个值都是 0 还是字符串值 null ? 0 是 int 的默认值,所以这是有道理的,但 0 的字符串值不会相加。
  • @jandrew:客户端正在访问正确的端点。通过邮递员,我发现问题在于 json 的序列化。查看 EDIT 标头之后的部分,我展示了两个略有不同的 json。一个是用邮递员手动创建的,它正在工作,另一个来自 jquery 调用,它不工作。在不工作的情况下,对象被初始化,但 2 个感兴趣的属性都设置为 0,尽管 json 有效负载中的值。请注意,这两个属性都是 int,不涉及字符串
  • 重新阅读您的编辑,我想我知道出了什么问题。您使用的是什么 JSON 序列化框架?除非您使用的是 .NET Core 3,否则我会假设它是 Newtonsoft JSON,除非您手动更改它。问题可能出在 .NET Core 应用程序中的某些序列化设置中。可能为什么您是 Postman 请求,但整数值周围没有引号。

标签: json .net-core asp.net-core-webapi


【解决方案1】:

创建一个答案,以便我们在您的帖子中没有一百万个 cmets。这是一个 ASP.NET Core 3.1 Web API 项目,对吗?如果是这样,请尝试进行这几项更改,看看是否能解决问题。

继承自 ControllerBase 而不是完整的 Controller 类。还将 [ApiController] 属性添加到您的 CodeController 类。然后对于您的 Post 操作,从 InfoNegozio 参数中删除 [FromBody] 属性。像这样:

[Route("api/[controller]")]
[ApiController]
public class CodeController : ControllerBase
{
    [HttpPost]
    public IActionResult Post(InfoNegozio value)
    {
       return Ok(value);
    }
}

看看这是否能解决任何问题。在模型绑定过程中有些事情搞砸了,这让我相信你的 JSON 序列化配置搞砸了。如果您可以发布您的 Startup.cs,那么我们可以查看是否存在配置错误。我刚刚打开了一个 .NET Core 3.1 Web API 项目并测试了我的一个控制器,它按预期工作。所以试一试,看看是否可以解决它。这些项目将影响控制器的配置方式,因此如果它是一个 API 控制器,处理标准 API 请求(应用程序/json),那么它应该被配置为这样。您可以阅读 ASP.NET Core 3.1 文档中的详细信息,但正确设置为 API 控制器将确保您的 JSON 请求被正确序列化。现在您已经将它设置为 MVC 控制器,这可能就是您遇到问题的原因。

编辑:另外,请考虑从您的控制器操作中返回一个 IActionResult。可能会使测试更容易,因为您实际上可以收到有助于您找到错误的响应。然后只需更改返回即可;返回确定();更新了代码示例以反映这一点。

【讨论】:

    【解决方案2】:

    如果你想像你提供的第一种方式那样写,可以使用parseInt确保传递int类型的数据。

    试试这个代码:

          var myData = { "IdNegozio": parseInt(idNegozio), "AttesaStimata": parseInt(tempoAttesa) };
            $.ajax({
                url: "api/Code",
                type: "POST",
                contentType: "application/json",
                dataType: "json",
               data: JSON.stringify(myData) 
            });
    

    还有一个选择(如果你使用的是core 3.x版本):

    • 安装Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.x 图书馆


    • 中添加services.AddControllersWithViews().AddNewtonsoftJson(); 在 startup.cs 中配置服务。

    经过这两个步骤,就可以使用开始时使用的json格式了。

    var myData = { "IdNegozio": idNegozio, "AttesaStimata": tempoAttesa };
                            $.ajax({
                                url: "api/ApiCode",
                                type: "POST",
                                contentType: "application/json",
                                dataType: "json",
                               data: JSON.stringify(myData)
    
                            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多