2016-04-28 28 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

相關問題