2014-03-26 56 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