2012-08-08 50 views
3

我正在使用Visual Studio 2012 RC。我使用的是默認的路由,具有以下Web API控制器:這個ASP.Net和Fiddler的例子有什麼問題?

public class FooController : ApiController 
{ 
    // GET api/foo 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    // GET api/foo/5 
    public string Get(int id) 
    { 
     return "value"; 
    } 

    // POST api/foo 
    public string Post(string abc) 
    { 
     Console.WriteLine("value: {0}", abc); 
     return "foo" + abc; 
    } 

    // PUT api/foo/5 
    public void Put(int id, string value) 
    { 
    } 

    // DELETE api/foo/5 
    public void Delete(int id) 
    { 
    } 
} 

我想做POST在提琴手的一個簡單的測試,所以我有

請求頭
的User-Agent:提琴手
內容類型:應用程序/ JSON

請求體
{ 「ABC」: 「DEF」}

當我調試請求,參數abc進來作爲null,而不是「def」。我的Fiddler語法有什麼問題嗎?

回答

5

(1)默認情況下,從URI獲取簡單類型。要從請求主體讀取簡單類型,請將[FromBody]屬性添加到參數中。

public string Post([FromBody] string abc) 

(2) '{ 「ABC」: 「DEF」}' 限定了一個名爲 「ABC」 屬性的對象 - 發送一個JSON串,請求體應該只是 「DEF」

+0

發現它應該= Fiddler中的def,而不是「def」。我發佈了一個關於我錯過了更多細節的答案。 – John 2012-08-09 14:39:26

+0

啊,我一定是醒了。 Cuong Le昨天回答了我的問題,但後來從我的帖子中刪除了他的回答。他發表了他自己的問題,你,邁克,回答。答案就是你的博客文章。直到現在我才注意到。 – John 2012-08-09 14:51:15

0

這個答案來自ASP.Net Web API站點sending-html-form-data上的一個鏈接,後者原來是Mike的博客文章(起初我沒有意識到)。 Web API團隊通過參數綁定做出了一些決定,這些決定與正常的MVC控制器完全不同。

發送「簡單類型」正確的語法是

public HttpResponseMessage PostSimple([FromBody] string value) 
{ 
// code goes here 

而且在提琴手,你把

=def   //THIS CANNOT HAVE QUOTES AND = IS MANDATORY 

OK,所以這裏是從MVC的工作非常不同的部分。

  1. 如Mike所說,您必須使用[FromBody]。
  2. 您只能有1個參數。如果你想要多於一個參數,你有兩個選擇:i)使用url查詢參數,而不是請求主體或ii)使用一個複雜的對象(即你自己的類)。
  3. 請求主體應該是一個簡單= def並且不能使用命名參數。