代码之家  ›  专栏  ›  技术社区  ›  Souvik Ghosh

输入无效.NET Core Web API

  •  21
  • Souvik Ghosh  · 技术社区  · 8 年前

    我正面临着一个奇怪的问题,几乎花了4个小时没有运气。

    我有一个简单的web api,我在表单提交时调用它。

    原料药-

    // POST: api/Tool
    [HttpPost]
    public void Post([FromBody] Object value)
    {
        _toolService.CreateToolDetail(Convert.ToString(value));
    }
    

    HTML格式-

    <!DOCTYPE html>
    <html>
    <body>
    
    <h2>HTML Forms</h2>
    <form name="value" action="https://localhost:44352/api/tool" method="post">
      First name:<br>
      <input type="text" id="PropertyA" name="PropertyA" value="Some value A">
      <br>
      Last name:<br>
      <input type="text" id="PropertyB" name="PropertyB" value="Some value B">
      <br><br>
      <!--<input type="file" id="Files" name="Files" multiple="multiple"/>-->
      <br><br>
      <input type="submit" value="Submit">
    
      </form>
    </body>
    </html>
    

    当我点击提交按钮时,我会发现下面的错误-

    {"":["The input was not valid."]}
    

    启动类中的配置-

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddSingleton<IConfiguration>(Configuration);
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }
    
        app.UseHttpsRedirection();
        app.UseMvc();
    }
    

    这只发生在post请求。获取请求工作正常。在postman rest客户机中测试时出现相同问题。有什么帮助吗?如果我能提供更多细节,请告诉我。

    5 回复  |  直到 8 年前
        1
  •  33
  •   Chris Pratt    7 年前

    不使用 FromBody .你提交的是 x-www-form-urlencoded (即标准html表单post)。这个 源体 属性用于json/xml。

    不能同时处理标准表单提交 来自同一操作的json/xml请求主体。如果需要双向请求操作,则需要两个独立的端点,一个端点的param用修饰 源体 一个没有。没有别的办法了。可以将操作的实际功能分解为两个操作都可以利用的私有方法,以减少代码重复。

        2
  •  12
  •   Adam Schumph    7 年前

    我刚刚在这里经历了类似的情况;我能够使用[frombody]而没有任何问题:

    public class MyController : Controller
    {
       [HttpPost]
       public async Task<IActionResult> SomeEndpoint([FromBody]Payload inPayload)
       {
       ...
       }
    }
    
    public class Payload
    {
       public string SomeString { get; set; }
       public int SomeInt { get; set; }
    }
    

    我发现的挑战是确保请求是使用设置为“application/json”的内容类型头发出的。使用postman,我的原始请求被返回为“输入无效”。添加内容类型头为我修复了问题。

        3
  •  6
  •   Pedram Ahmadpour    7 年前

    只是改变 [FromBody] [FromForm] 是的。
    这个 FromForm 属性用于内容类型发送的已提交表单中的传入数据 application/x-www-url-formencoded FromBody 将以默认方式分析模型,在大多数情况下,默认方式由内容类型发送 application/json ,来自请求正文。
    多亏了 https://stackoverflow.com/a/50454145/5541434

        4
  •  0
  •   Ben Krueger    8 年前

    就像mjwills和davidg所说的,您可能应该在控制器参数实现中使用一个具体的类,比如:

    public class MyClass
    {
        public string PropertyA { get; set; }
    
        public string PropertyB { get; set; }
    }
    
        5
  •  0
  •   ShadowKras    8 年前

    如果检查浏览器上的“网络”选项卡,您会注意到表单将输入值作为参数发送到URL,而不是发送 它本身 . 所以命名它 价值 不会将名为“value”的属性发送到服务器。

    相反,post方法需要一个名为 价值 ,它可以是任何类型(因为它是一个对象),并且永远无法实现该参数,因为它正在接收这些其他参数:propertya、propertyb和文件。

    您的完整post url现在可能应该如下所示:

    https://localhost:44352/api/tool?PropertyA=X&PropertyB=Y&Files=Z

    还要注意,您没有指定 岗位 方法,因此我不确定客户端将如何访问 /API/工具 是的。您可能需要在控制器上指定该url,添加 路线 属性:

    [路线(“API/工具”)]

    否则,自然路径是hostname/controller/method或 https://localhost:44352/api/post ,如果您的控制器名为api。否则它将用控制器的名称替换“api”。

        6
  •  0
  •   tonderaimuchada    6 年前

    将正文文本类型更改为所需的格式,例如从文本更改为json(application)。

        7
  •  0
  •   juan carlos peña cabrera    6 年前

    我也有同样的问题我的解决方案是禁用de attribute apicontroller我不知道为什么你能读到这个[ https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-2.2#multipartform-data-request-inference] 我不理解有什么问题

    [Produces("application/json")]
        [Route("api/[controller]")]
        //[ApiController]<<remove this
        public class PagosController : ControllerBase
    

    你的方法

    [HttpPost("UploadDescuento")]
    public async Task<IActionResult> UploadDescuento(IEnumerable<IFormFile> files)