在 web-api POST (C#) 上输入 JSON

Posted

技术标签:

【中文标题】在 web-api POST (C#) 上输入 JSON【英文标题】:Input JSON on web-api POST (C#) 【发布时间】:2021-04-11 05:05:37 【问题描述】:

我目前将我的 Web API 绑定到我的计算机文件,如下所示:

namespace APIDissertação.Controllers

    [Route("api/[controller]")]
    [ApiController]
    public class DissertacaoController : ControllerBase
    
        [HttpPost]
        public IActionResult Post(/*JObject InputRequest*/)
        
            try
            
                DissertacaoClass MeuProblema = new DissertacaoClass();
                MeuProblema.ArquivoGrafo_InicializarProblema(@"C:\C#\ArquivoGrafo.txt");
                MeuProblema.ArquivoNv0(@"C:\C#\ArquivoNv0.txt");
                MeuProblema.LerArquivoDemandas(@"C:\C#\ArquivoDemandas.txt");
                MeuProblema.GerarCaminhos_Arcos();
                String result = MeuProblema.CriarResolverProblema();
                return Ok(result);//ResultRequest);
            
            catch (Exception ex)
            
                return BadRequest();
            
        

我想要做的是将此文件替换为将输入到 API 的 JSON,JSON 如下所示:


 "QuantidadeNosSemTempo": 4
 "QuantidadeTempos": 12
 "Grafo_Terminal;X;Y;Nv0": [
  "0;0;0;1", 
  "1;2;2;1", 
  "2;3;1;1", 
  "3;0;3;1" 
 ],
 "Demanda;TerminalNoInicial;TempoNoInicial;TerminalNoFinal;TempoNoFinal;Tamanho" : [
  "0;0;0;2;8;0,7",
  "1;0;0;3;11;0,3",
  "2;1;0;2;8;0,5",
  "3;1;1;2;9;0,5",
  "4;2;1;0;10;0,3",
  "5;2;1;3;11;0,2"
 ]

我该怎么做? 我是 web api 开发的新手(实际上不知道我在做什么),

提前致谢,

塔雷克

【问题讨论】:

【参考方案1】:

如果您希望所有结构都被接受,您可以使用动态类型。

但是,我更喜欢使用 https://app.quicktype.io/ 之类的工具生成类型,然后再使用该 DTO。

您的 json 结构也有一些缺少逗号的问题


 "QuantidadeNosSemTempo": 4,
 "QuantidadeTempos": 12,
 "Grafo_Terminal;X;Y;Nv0": [
  "0;0;0;1", 
  "1;2;2;1", 
  "2;3;1;1", 
  "3;0;3;1" 
 ],
 "Demanda;TerminalNoInicial;TempoNoInicial;TerminalNoFinal;TempoNoFinal;Tamanho" : [
  "0;0;0;2;8;0,7",
  "1;0;0;3;11;0,3",
  "2;1;0;2;8;0,5",
  "3;1;1;2;9;0,5",
  "4;2;1;0;10;0,3",
  "5;2;1;3;11;0,2"
 ]

之后,您只需发送一个内容类型为“application/json”的 http POST 请求,并且请求的主体包含该 url 的 json,您应该一切顺利。

【讨论】:

【参考方案2】:

就像建议一样,也许你可以稍微改变一下你的 json,像这样(注意我把你的 json 中的两个数组更改为 FirstArraySecondArray):


"QuantidadeNosSemTempo": 4,
"QuantidadeTempos": 12,
"FirstArray": [
        "Grafo_Terminal": 0,
        "X": 0,
        "Y": 0,
        "Nv0": 1
    , 
        "Grafo_Terminal": 1,
        "X": 2,
        "Y": 2,
        "Nv0": 1
    , 
        "Grafo_Terminal": 2,
        "X": 3,
        "Y": 1,
        "Nv0": 1
    , 
        "Grafo_Terminal": 3,
        "X": 0,
        "Y": 3,
        "Nv0": 1
    
],
"SecondArray": [
        "Demanda": 0,
        "TerminalNoInicial": 0,
        "TempoNoInicial": 0,
        "TerminalNoFinal": 2,
        "TempoNoFinal": 8,
        "Tamanho": 0.7
    , 
        "Demanda": 1,
        "TerminalNoInicial": 0,
        "TempoNoInicial": 0,
        "TerminalNoFinal": 3,
        "TempoNoFinal": 11,
        "Tamanho": 0.3
    , 
        "Demanda": 2,
        "TerminalNoInicial": 1,
        "TempoNoInicial": 0,
        "TerminalNoFinal": 2,
        "TempoNoFinal": 8,
        "Tamanho": 0.5
    , 
        "Demanda": 3,
        "TerminalNoInicial": 1,
        "TempoNoInicial": 1,
        "TerminalNoFinal": 2,
        "TempoNoFinal": 9,
        "Tamanho": 0.5
    , 
        "Demanda": 4,
        "TerminalNoInicial": 2,
        "TempoNoInicial": 1,
        "TerminalNoFinal": 0,
        "TempoNoFinal": 10,
        "Tamanho": 0.3
    , 
        "Demanda": 5,
        "TerminalNoInicial": 2,
        "TempoNoInicial": 1,
        "TerminalNoFinal": 3,
        "TempoNoFinal": 11,
        "Tamanho": 0.2
    
]

作为输入请求的 C# 类可能是 DTO (InputRequest):

    public class FirstArray    
        public int Grafo_Terminal  get; set;  
        public int X  get; set;  
        public int Y  get; set;  
        public int Nv0  get; set;  
    

    public class SecondArray    
        public int Demanda  get; set;  
        public int TerminalNoInicial  get; set;  
        public int TempoNoInicial  get; set;  
        public int TerminalNoFinal  get; set;  
        public int TempoNoFinal  get; set;  
        public double Tamanho  get; set;  
    

    public class InputRequest    
        public int QuantidadeNosSemTempo  get; set;  
        public int QuantidadeTempos  get; set;  
        public List<FirstArray> FirstArray  get; set;  
        public List<SecondArray> SecondArray  get; set;  
    

因此,如果您实施此更改,您的 post 方法将是:

[HttpPost]
public IActionResult Post(InputRequest inputRequest)

    try
    
        DissertacaoClass MeuProblema = new DissertacaoClass();
        String result = MeuProblema.CriarResolverProblema(inputRequest); //you will have to change the way you resolve the problem
        return Ok(result); //ResultRequest
    
    catch (Exception ex)
    
        return BadRequest();
    

【讨论】:

以上是关于在 web-api POST (C#) 上输入 JSON的主要内容,如果未能解决你的问题,请参考以下文章

无法在 web-api 2 中创建新用户

来自 ajax 的 Web api Post 调用失败

使用 C# 在 Windows 8 Metro App 上发送 POST 请求

参数中带有 IEnumerable 的 C# OData Web API POST 端点返回错误 400,输入无效

使用 Oauth2/OpenID 连接构建 Web-API

ASP.NET web api 无法获取 application/x-www-form-urlencoded HTTP POST