2014-03-26 89 views
0

我有一個看起來像這樣一個jQuery的方法:發佈至網絡API參數爲null

$.post("/api/amazon/signature", { "policy": policy }, function (data) { 
    console.log(data); 
}); 

API方法看起來像這樣〜:

// POST api/amazon/signature 
[HttpPost] 
[Route("api/amazon/signature")] 
public IHttpActionResult GetSignature([FromBody]string policy) 
{ 
    var bKey = Encoding.ASCII.GetBytes(ConfigurationManager.AppSettings["AWSSecretKey"]); 
    var hmacSha1 = new HMACSHA1(bKey); 

    var bPolicy = Encoding.ASCII.GetBytes(policy); 
    var hash = hmacSha1.ComputeHash(bPolicy); 
    var encoded = Convert.ToBase64String(hash); 

    return Ok(encoded); 
} 

但是當我運行這段代碼政策始終爲空! 如果我改變我的方法是:

public class Signature 
{ 
    public string Policy { get; set; } 
} 

// POST api/amazon/signature 
[HttpPost] 
[Route("api/amazon/signature")] 
public IHttpActionResult GetSignature([FromBody]Signature model) 
{ 
    var bKey = Encoding.ASCII.GetBytes(ConfigurationManager.AppSettings["AWSSecretKey"]); 
    var hmacSha1 = new HMACSHA1(bKey); 

    var bPolicy = Encoding.ASCII.GetBytes(model.Policy); 
    var hash = hmacSha1.ComputeHash(bPolicy); 
    var encoded = Convert.ToBase64String(hash); 

    return Ok(encoded); 
} 

和修改我的jQuery這樣的:

$.post("/api/amazon/signature", { "Policy": policy }, function (data) { 
    console.log(data); 
}); 

它工作得很好....

有人能告訴我爲什麼嗎?

回答

1

ASP.NET Web API將請求正文全部綁定到一個參數(僅限一個參數,而不是更多)。默認情況下,body被綁定到一個複雜的類型。因此,當您將參數類型更改爲Policy這是一種複雜類型時,您無需實際指定FromBody。現在綁定也能正常工作,因爲你發送的JSON對象看起來像這樣的{ "policy": policy }。 Web API在將JSON對象綁定到複雜類型時沒有問題。

當涉及到一個簡單的類型時,您必須指定stringFromBody,因爲默認情況下,Web API通過URI路徑和查詢字符串進行綁定。但是,在這種情況下,您無法發送JSON對象。 Web API將把整個身體綁定到該參數,即string。所以,請求主體必須只是一個像這樣的字符串 - "ABC123"而不是JSON對象。如果您僅在請求正文中發送「ABC123」(包括引號),則您的string參數將填入ABC123。

+0

感謝您的詳細解釋 – r3plica