【问题标题】:Post request from Console to API从控制台向 API 发布请求
【发布时间】:2023-02-13 11:28:48
【问题描述】:

我正在尝试创建随机值并将它们发送到位于 mvc api 控制器中的控制器。但是我在 api 中的数据总是像默认值一样为 0 或 null。在控制台应用程序中,我正在创建它们,但我的数据为空或 0。我真正的问题是什么?

我的控制台代码:

using MSE.DTO.DTOs.WorkStation;
using Newtonsoft.Json;
using System.Net.Http.Json;
using System.Text;

var random = new Random(DateTime.Now.Millisecond);
var data = new WorkStationRandomValueDTO
{
    WorkStationId = random.Next(1, 100),
    Temperature = (decimal)Math.Round(random.NextDouble() * 100, 2),
    Pressure = (decimal)Math.Round(random.NextDouble() * 2000, 2),
    Status = random.Next(0, 1) == 1
};


using (var client = new HttpClient())
{
    var content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
    var response = await client.PostAsync("http://localhost:5002/WorkStationRandom/Post", content);
    if (response.IsSuccessStatusCode)
    {
        Console.WriteLine($"WorkStationId: {data.WorkStationId}\nTemperature: {data.Temperature}\nPressure: {data.Pressure}\nStatus: {data.Status}\n ");
        Console.WriteLine("Data posted successfully");
    }
    else
    {
        Console.WriteLine("Error occured while posting data");
        Console.WriteLine(await response.Content.ReadAsStringAsync());
    }
}
Console.ReadLine();

我的 Mvc API 代码:

using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using MSE.DataAccess.Context;
using MSE.DTO.DTOs.WorkStation;
using MSE.Entity.Entities.Concrete;
using FromBodyAttribute = System.Web.Http.FromBodyAttribute;
using HttpGetAttribute = System.Web.Http.HttpGetAttribute;
using HttpPostAttribute = System.Web.Http.HttpPostAttribute;

namespace MSE.Web.Controllers
{
    public class WorkStationRandomController : ControllerBase
    {
        private readonly ApplicationDbContext _dbContext;
        private readonly IMapper _mapper;
        public WorkStationRandomController(ApplicationDbContext dbContext, IMapper mapper)
        {
            _dbContext = dbContext;
            _mapper = mapper;
        }

        [HttpPost]
        public IActionResult Post([FromBody] WorkStationRandomValueDTO data)
        {
            if (data != null && data.WorkStationId != 0 && data.Temperature != 0 && data.Pressure != 0)
            {
                data.Status = true;
                var workStation = _mapper.Map<WorkStation>(data);
                _dbContext.WorkStations.Add(workStation);
                _dbContext.SaveChanges();

                return Ok();
            }
            else
            {
                return BadRequest("Data is not valid.");
            }
        }

        [HttpGet]
        public string Get()
        {
            return "ok";
        }
    }
}

在这张照片中你可以看到我的问题。

谢谢。

我的观点是在控制台中创建随机值并将它们发送到控制器。但我总是得到 0 或空值。

【问题讨论】:

  • 你的创业公司有services.AddControllers().AddNewtonsoftJson();吗?
  • 请edit你的问题来分享一个重现问题的minimal reproducible example。具体来说,WorkStationRandomValueDTO的定义是什么?例如。它有字段或属性吗?
  • 是的,我有 stuard,但仍然无法正常工作。我唯一的问题是我的数据为空或 0。
  • @yigit_tanyel 在您的代码中我可以看到 [FromBody],但图像中没有。它应该是。您还需要发布 WorkStationRandomValueDTO 类

标签: c# asp.net-core json.net


【解决方案1】:

我正在尝试创建随机值并将它们发送到控制器 在 mvc api 控制器中。但是我在 api 中的数据总是 0 或 null 就像他们的默认。在控制台应用程序中,我正在创建它们,但我的数据来了 null 或 0。我真正的问题是什么?

好吧,有几件事可能会导致您在控制器上获得空数据。我对此的看法是,如果您使用有效的 class property 构建它并且根据您的共享代码 sn-p 在您的 program.cs 文件中的 AddJsonOptions 上没有其他配置,请求应该到达您的控制器。

根据您的共享代码正确请求格式:

控制台应用程序片段:

using Newtonsoft.Json;
using System.Text;

var random = new Random(DateTime.Now.Millisecond);
var data = new WorkStationRandomValueDTO
{
    WorkStationId = random.Next(1, 100),
    Temperature = (decimal)Math.Round(random.NextDouble() * 100, 2),
    Pressure = (decimal)Math.Round(random.NextDouble() * 2000, 2),
    Status = random.Next(0, 1) == 1
};


using (var client = new HttpClient())
{
   
 
    var content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
    var response = await client.PostAsync("http://localhost:5094/WorkStationRandom/post", content);
    if (response.IsSuccessStatusCode)
    {
        Console.WriteLine($"WorkStationId: {data.WorkStationId}
Temperature: {data.Temperature}
Pressure: {data.Pressure}
Status: {data.Status}
 ");
        Console.WriteLine("Data posted successfully");
    }
    else
    {
        Console.WriteLine("Error occured while posting data");
        Console.WriteLine(await response.Content.ReadAsStringAsync());
    }
}


public class WorkStationRandomValueDTO
{
    public int WorkStationId { get; set; }
    public decimal Temperature { get; set; }
    public decimal Pressure { get; set; }
    public bool Status { get; set; }

   
}

API 代码片段:

public class WorkStationRandomController : ControllerBase
    {
       
        [HttpPost]
        public IActionResult Post([FromBody] WorkStationRandomValueDTO data)
        {
            if (data != null && data.WorkStationId != 0 && data.Temperature != 0 && data.Pressure != 0)
            {
                //data.Status = true;
                //var workStation = _mapper.Map<WorkStation>(data);
                //_dbContext.WorkStations.Add(workStation);
                //_dbContext.SaveChanges();

                return Ok();
            }
            else
            {
                return BadRequest("Data is not valid.");
            }
        }
    }

    public class WorkStationRandomValueDTO
    {
        public int WorkStationId { get; set; }
        public decimal Temperature { get; set; }
        public decimal Pressure { get; set; }
        public bool Status { get; set; }
    }

输出:

笔记:

此处不会考虑任何未共享的其他配置。

为什么那么你的一个不工作:

1.如果您在 program.cs 中有任何未共享的配置 和我们:

如果您遵循我上面的示例,您的请求应该到达您的控制器,并带有有效数据,如您在给定的调试捕获中所见。在这种情况下,您的 program.cs 文件中不需要 builder.Services.AddControllersWithViews().AddJsonOptions(options =>。

例如:如果您的 AddJsonOptions 上有 PropertyNameCaseInsensitive 属性,它可能不起作用:

options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;

2.如果将 WorkStationRandomValueDTO 定义为 Property as Field

如果您将 WorkStationId、Temperature 和其他成员定义为 Fields,则在您的 WorkStationRandomValueDTO 类中,如下所示:

公共类 WorkStationRandomValueDTO { 公共 int WorkStationId; 公共十进制温度; 公共十进制压力; 公共布尔状态; }

根据您的共享代码,字段而不是 Property 可能会导致您的控制器中出现空数据。这并不意味着您不能发送字段值,而是您此时发送请求的方式导致空参数。

因此,以上两个问题可能会导致您的控制器出现空请求。在这里,我相应地重现了您的场景。

使用 Null 参数重现的问题:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多