2016-04-28 47 views
0

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

这是我的方法:

[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/[email protected],pass,salt,remref/ 

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

+0

你为什么要把对象放在Uri而不是身体? –

+0

@RyanGates在GET中? –

+3

@KennethK。我不认为'CreateUser'应该是一个'GET'。我会认为这将是一个'POST'。我没有仔细观察。现在,我做到了,它让我感到奇怪。 –

回答

3

这是一个非常糟糕的做法,就像你在做的那样通过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数据。

0

考虑使用POST如果适用

虽然它可能不这样做,能,你可能要考虑将这些字段<form>内,简单地张贴到体内的服务器,而不是使用实际的网址本身。密码,盐和哈希通常不是你想要像那样传递的东西。

如果你必须使用一个GET

您是否尝试过传递值作为适当的查询字符串参数呢?

  • 用户 = “用户”
  • UserEmailAddress = “[email protected]
  • http://localhost:59509/Adduser/[email protected]&PasswordHash=abc&Salt=123&RemoteRefNumber=foo 
    

    这应该根据您当前的路线设置以下属性PasswordHash =“abc”

  • =“123”
  • RemoteRefNumber =“富”

MVC必须有如何将这些属性绑定到那些在你的类的一些想法,所以除非名称相匹配的预期,这将不知道如何将诸如“user”之类的地图映射到“UserEmailAddress”。如前所述,这并不理想,可能会出现各种安全问题(所以只能在原型/非生产环境中使用类似的东西)。

+0

http:// localhost:59509/AddUser/user?UserEmailAddress = test&PasswordHash = pas%E2%80%8C%E2%80%8Bs&Salt = salt&RemoteRefNumber = remref this still give me null。 – Alma