【问题标题】:complex object is empty when use in Web API input复杂对象在 Web API 输入中使用时为空
【发布时间】:2016-04-28 18:33:24
【问题描述】:

我在 Web API 中有一个方法,我使用对象作为输入,但是当我尝试使用 URI 运行 API 时,对象内的字段为 Null。

这是我的方法:

    [HttpGet]
    [Route("AddUser/{user}")]
    public async Task<string> CreateUser([FromUri]AddUser user)
    {
        //LoansApiTrace.Trace.Verbose(EventId.Start, () => string.Format("{0}: {1}", "AddUser", user.));
        string Exception = await Repository.AddUserAsync(user);
        return Exception;
    }

这是 AddUser 对象:

 public class AddUser
    {     
    public string UserEmailAddress { get; set; }
    public string PasswordHash { get; set; }
    public string Salt { get; set; }
    public string RemoteRefNumber { get; set; }
  }

这是 URI:

http://localhost:59509/Adduser/user=test@yahoo.com,pass,salt,remref/

它转到方法,但 UserEmailAddress , PasswordHash ,..所有 4 都是空的。

【问题讨论】:

  • 为什么要将对象放在 Uri 而不是 body 中?
  • @RyanGates 在GET?
  • @KennethK。我认为CreateUser 根本不应该是GET。我认为这将是POST。我看的不够仔细。现在我做到了,这让我觉得很奇怪。
  • 切勿将 GET 用于具有副作用的操作。 GET 应始终为 idempotent and safe
  • 我同意@FedericoDipuma。对于创作,我会使用 POST。

标签: c# asp.net-web-api


【解决方案1】:

像您正在做的那样通过 URI 传递秘密数据是一种非常糟糕的做法。那么我就不会尝试给出解决方案。

最佳做法是通过您的请求正文传递此类数据并使用 Http POST 方法:

[HttpPost]
[Route("AddUser/{userId}")]
public async Task<string> CreateUser(string userId, [FromBody]AddUser user)
{
     // Find a user by userId
     // Then update the user data.
}

当用户需要发送该类型的数据时,还建议使用 HTTPS。

【讨论】:

    【解决方案2】:

    如果适用,请考虑使用POST

    虽然它可能不可行,但您可能需要考虑在 &lt;form&gt; 中添加这些字段,并简单地将它们发布到正文中的服务器,而不是使用实际的 URL 本身。密码、盐和散列通常不是您想要传递的东西。

    如果你必须使用GET

    您是否尝试过将值作为正确的查询字符串参数传递?

    http://localhost:59509/Adduser/user?UserEmailAddress=test@yahoo.com&PasswordHash=abc&Salt=123&RemoteRefNumber=foo
    

    这应该根据您当前的路线设置以下属性:

    • 用户 = "用户"
    • UserEmailAddress = "test@yahoo.com"
    • 密码哈希 = "abc"
    • = "123"
    • RemoteRefNumber = "foo"

    MVC 必须知道如何将这些属性绑定到您的类中的属性,因此除非名称符合预期,否则它将不知道如何将“user”之类的内容映射到“UserEmailAddress”。如前所述,这并不理想,并且会带来各种安全问题(因此只能在原型/非生产环境中使用类似的东西)。

    【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2022-01-26
    • 2014-12-20
    • 1970-01-01
    • 2012-01-20
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多