【问题标题】:Simple POST with Web Api .NET Core使用 Web Api .NET Core 的简单 POST
【发布时间】:2018-10-20 22:56:33
【问题描述】:

尽管在 stackoverflow 上找到了不同的问题和答案,但我无法生成我的代码。

这是我的问题,我想接收客户端的UsernamePassword进行验证(相等仅用于示例)。

但是LoginPost 变量始终是null。 此外,我很难理解同时向客户端发送 http 代码和 json 的最佳方式。

using Microsoft.AspNetCore.Mvc;
using web.Models;

namespace web.Controllers
{
    [Produces("application/json")]
    [Route("api/[controller]")]
    public class LoginController : ControllerBase
    {
        [HttpPost]
        public ActionResult<LoginPost> LoginPost([FromBody] LoginPost loginPost)
        {
            // (1) FAIL, loginPost variable is null

            if (loginPost.Username == loginPost.Password)
            {
                return loginPost;
            }


            // (2) How to add a message like "User/Password fails"

            return Unauthorized(); 
        }

    }
}

注意代码中的注释(1)和(2)。

这是jQuery code

$.ajax({
        url: '../api/Login',
        type: 'POST',
        dataType: "json",
        contentType: "application/json, charset=utf-8",
        data: {
            Username: username,
            Password: password
        },
        statusCode: {
            200: function (data) {
                console.log(data);
            }
            401: function (data) {
                console.log(data);
            }
            500: function (data) {
                console.log(data);
            }
        }
});

LoginPost.cs 类:

public class LoginPost
{
    public string Username { get; set; }
    public string Password { get; set; }
}

【问题讨论】:

  • 那么上面的代码是做什么的呢?有错误吗?如果有,是什么?
  • @DavidG 我已经解释过了,我不明白你留言的兴趣
  • @DavidG 我可能会重复自己,但[FromBody] LoginPost 数据始终是null。我无法通过 POST 接收数据

标签: c# .net post .net-core


【解决方案1】:

由于您似乎不想使用json,请将数据作为表单发布。

删除 contentType: "application/json, charset=utf-8", 来自您的 ajax 调用。

'application/x-www-form-urlencoded; charset=UTF-8' 是默认值,因此数据将作为表单发送。 同时删除 [FromBody] 属性,它应该可以工作

【讨论】:

    【解决方案2】:

    登录控制器工作正常,我用 Postman 对其进行了测试。问题在于 ajax 调用:它不会将数据作为POST 请求的主体发送,而是作为 URL 查询参数(即Username=username&amp;Password=password)发送。

    要在POST 请求的正文中发送数据,您需要将数据作为json 字符串发送:

    data: JSON.stringify({
        "Username": "username",
        "Password": "password"
    }),
    

    【讨论】:

    • 好吧!但是如何避免JSON.stringify 函数呢?我需要将[FromBody] 更改为另一个?对于旧的 .NET 版本,它使用 [FromUri],但这里不存在
    • 最简单的解决方案是删除 [FromBody] 属性并从 ajax 调用中删除 contentType。然后数据将以form data 发送,它就可以工作了。
    【解决方案3】:

    对于第(2)个问题,您可以返回状态码:

    return StatusCode(401, "User/Password fails");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2021-09-14
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多