如何将 JSON 作为参数传递给控制器​​ .net api 中的 Post 方法

Posted

技术标签:

【中文标题】如何将 JSON 作为参数传递给控制器​​ .net api 中的 Post 方法【英文标题】:How to pass JSON as parameter to Post method in controller .net api 【发布时间】:2021-12-10 10:29:34 【问题描述】:

首先我想说我是 asp.net 的新手,我现在正在努力学习至少基本的东西,所以不要对我苛刻:) 我的控制器中有一个 post 方法,它必须从 post 请求正文中接收一个 json,然后将信息添加到数据库中。所以方法如下:

  [HttpPost]
    public ActionResult<DeviceData> InsertData(DeviceData deviceData)
    
        var device = deviceContext.Devices.Find(deviceData.Id);

        if (device == null)
        
            return BadRequest(Messages.DeviceNotExist);
        

        deviceContext.DeviceData.Add(new DeviceData
        
            Timestamp = DateTime.Now,
            Latitude = deviceData.Latitude,
            Longitude = deviceData.Longitude,
            Altitude = deviceData.Altitude,
            Speed = deviceData.Speed,
            DeviceId = deviceData.DeviceId
        );
        deviceContext.SaveChanges();
        return Ok(deviceContext.DeviceData.OrderBy(x=>x.Id).Last());
    

我最好的猜测是我的参数不正确,因为我试图传递 json 并且方法中的参数是 DeviceData 类型。 所以我的问题是我应该更改和添加什么来获取请求的 json 主体并使用数据执行插入到数据库中,然后返回响应 - json 对象? 如果需要,我会使用 Postman 来处理请求。

【问题讨论】:

错误是什么?并发布您用于邮递员的 json。 您正在检查设备是否存在以及是否存在尝试添加。在做什么?正在添加新设备或更新? 还有什么问题?你有什么错误吗? @Serge 我有两个模型:设备和设备数据。设备数据与其 ID 相关,因为如果我有例如 5 个设备,我想知道哪些设备已在数据库的设备数据表中发布数据。所以是的,首先我检查设备是否存在,如果存在,那么我将在与该设备相关的数据表中添加新数据记录。我正在使用 json body "Latitude": 23, "Longitude": 43, "Altitude": 123, "Speed": 11, "DeviceId": 7 向 localhost:44372/api/DeviceData 发送帖子请求我收到错误: “设备不存在!”当 device = null 时抛出 【参考方案1】:

当您检查设备是否存在时,您使用了错误的 Id,您必须改用 DeviceId

 var exist = deviceContext.Devices.Any(i=> i.Id==deviceData.DeviceId);

 if (!exist) return BadRequest(Messages.DeviceNotExist);

恕我直言,替换

 deviceContext.DeviceData.Add(new DeviceData
        
            Timestamp = DateTime.Now,
            Latitude = deviceData.Latitude,
            Longitude = deviceData.Longitude,
            Altitude = deviceData.Altitude,
            Speed = deviceData.Speed,
            DeviceId = deviceData.DeviceId
        );

 deviceData.Timestamp = DateTime.Now;
 deviceContext.DeviceData.Add(deviceData);

【讨论】:

以上是关于如何将 JSON 作为参数传递给控制器​​ .net api 中的 Post 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将json POST数据作为对象传递给Web API方法?

如何将 JSON 返回数据作为参数传递给 URL 路由(laravel)

如何将两种形式作为参数传递给 laravel 控制器?

如何将 json 对象传递给 mvc 控制器

如何将枚举作为字符串参数传递给 Authorize 属性?

在 ASP.Net Core 项目中使用 ADO.Net 将 JSON 类型作为参数传递给 SQL Server 2016 存储过程