2016-03-01 192 views
2

我正在使用C#編寫簡單的WebApi程序。 (我知道MVC還算不錯,但我是新來的WebAPI。)它包含供應商控制器(VendorsController.cs),其中包含如下面的代碼樣本中的「getvendor」行動:使用Fiddler向WebApi發送POST請求

[RoutePrefix("api/vendors")] 
public class VendorsController : ApiController 
{ 
    [Route("getvendor"), HttpPost] 
    public TAPUser GetVendor([FromBody] string username) 
    { 
     Int32 userid = -1; 

    ... 

的路線配置如下:

// Web API routes 
config.MapHttpAttributeRoutes(); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional 
); 

我正在使用Fiddler來測試程序。首先,我跑不[FromBody]上面的代碼,並使用提琴手在這樣的URL發送與用戶名的POST請求: http://localhost:60060/api/vendors/getvendor?username=tapuser

這工作得很好。 tapuser作爲參數傳遞給GetVendor,並且該操作返回了預期的結果。

接下來,我添加了[FromBody],並將username = tapuser放在請求正文中。這一次,當我發送請求時,tapuser沒有被傳遞給操作。 GetVendor()的參數爲null。我嘗試過請求主體上的變體,例如{「username」:「tapuser」},但它沒有幫助。我也嘗試過以各種方式更改路由,例如將routeTemplate更改爲「api/{controller}/{action}/{id}」。這也沒有幫助。我確信我錯過了一些非常簡單的事情,但我只是沒有看到它。

+1

您是否確定在請求標頭中將content-type指定爲application/json?如果仍然沒有解決,你能分享你的提琴手屏幕截圖/代碼嗎? –

+0

備註:來自Fiddler的原始請求視爲文本會比圖片更好 –

+0

POST http:// localhost:60060/api/vendors/getvendor HTTP/1.1 User-Agent:Fiddler Content-Type:application/json 主機:localhost:60060 內容長度:16 username = tapuser – Tim

回答

7

嘗試將您的值直接放入請求正文。看到這個。 enter image description here

+0

現在我回頭看看這個,我意識到你有正確的答案。我只是沒有接受它。非常感謝您的回覆。 – Tim

+0

@drunk .. thnx清除它,對於任何基於對象的參數,我們不需要使用[Frombody],但對於我們需要的簡單的參數。然而,要將參數作爲字符串傳遞,我們確實需要使用引號(Tim),因爲它並不像您理解的那樣,因爲在int情況下可能不需要引號 –

0

現在我做了一些調試,並能夠重新創建您遇到的問題。

我最終能夠通過執行到數據獲取的動作如下:

首先我創建了一個類來作爲有效載荷容器。

public class body { 
    public string username { get; set; } 
} 

和更新的動作,以匹配

[Route("getvendor"), HttpPost] 
public TAPUser GetVendor([FromBody] body payload) {...} 

然後使用招我堆肥請求到終結點進行測試。

POST http://localhost:60060/api/vendors/getvendor HTTP/1.1 
User-Agent: Fiddler 
Host: localhost:60060 
Content-Type: application/x-www-form-urlencoded; charset=utf-8 
Content-Length: 16 

username=tapuser 

當我的中斷點被擊中時,身體/有效載荷被用戶名填充爲tapuser。

UPDATE

現在雖然上面的工作,我不能完全肯定它解決您的問題,所以我做了一些谷歌搜索和整個這個

Parameter Binding in ASP.NET Web API

來的地方是顯示以下示例使用[FromBody]

要強制Web API讀取簡單的typ從請求體E中, [FromBody]屬性添加到參數:

public HttpResponseMessage Post([FromBody] string name) { ... } 

在這個例子中,網絡API將使用介質型格式化器來讀取從該名稱的 值請求正文。這裏是一個示例客戶端 請求。

POST http://localhost:5076/api/values HTTP/1.1 
User-Agent: Fiddler 
Host: localhost:5076 
Content-Type: application/json 
Content-Length: 7 

"Alice" 

當一個參數具有[FromBody],網絡API使用Content-Type頭 選擇一個格式化器。在此示例中,內容類型爲 「application/json」,請求正文爲原始JSON字符串(不是 JSON對象)。

最多允許一個參數從消息體中讀取。所以 這是行不通的:

// Caution: Will not work!  
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... } 

其原因的規則是,請求正文可以存儲在一次只能讀一個 非緩衝流。

當我恢復了我原來的更改並遵循示例它按預期工作。

希望這會有所幫助。

+0

我嘗試了所有這些東西。恩科西 - 看起來你嘗試了和我一樣的東西,他們爲你工作,但不適合我。所以我不確定發生了什麼事。 – Tim

0

我發現如果我把'tapuser'放在請求正文中,使用單引號或雙引號,它就可以工作。引號似乎是答案。如果我在引號內加入tapuser以外的內容,整個事情都會作爲參數傳遞。例如,'{username = tapuser}'將作爲{username = tapuser}傳遞。謝謝大家的意見。