ASP.NET WebAPI String 傳值問題
如果我們再WebAPI中定義了只有一個string引數的WebAPI函式,如下所示:
[HttpPost]
public string TrackBill(string str)
{
return str;
}
就是這樣一個簡單的函式,有一個字串型別的引數,當我們用PostMan對該API進行測試,給api介面傳一個Key為str,value為123的鍵值對。
其結果如下:
我們看到,返回的結果是找不到與該請求匹配的資源。很奇怪,我們的給該方法指定了HttpPost的方法,也指定了引數名為str的引數,請求的方法是post方法,引數也是str,卻匹配不到該函式。
1.第一步。
給string str加上[FromBody]進行修飾。
如下所示。
[HttpPost]
public string Post([FromBody]string str)
{
return str;
}
我們在在postman中用同樣的方法進行post訪問。
返回值為null 也就是說匹配到了webapi中的post方法,但是該方法根本沒有接收到postman中傳遞過去的key 為str Vaue為123的值。
2.第二步
查閱相關資料後,得出結論,原來當方法中只有一個string型別的引數時,不能給該鍵值對賦予key值,也就是說key必須得空著。
如下所示。
我們在postman中把key空著,然後value為123,結果webapi中的post函式成功獲取到了改值。
不知道微軟在這樣設計的時候出於什麼考慮。
3.第三步。
post函式兩個string型別的引數。填加post的過載方法,如下:
[HttpPost]
public string Post([FromBody]string str1, [FromBody]string str2)
{
return string.Format("第一個str是:{0},第二個str是{1}",str1,str2);
}
我在在postman中和上例一樣,不指定key,然後指定兩個value,看看結果會怎樣?
當兩個key都是空著的時候,出現錯誤,提示,“無法將多個引數(“str1”和“str2”)繫結到請求的內容。”
也就是說多個string引數,那麼key不能空著,我們加上試試。
結果讓人很意外,任然是不可以。
4.第四步,
那麼,當有多個string型別的引數怎麼辦呢?
我想到的解決辦法是用object型別取代string型別。
更改如下:
public class HomeController : ApiController
{
[HttpPost]
public string Post(Str str)
{
return string.Format("第一個str是:{0},第二個str是{1}",str.Str1,str.Str2);
}
}
public class Str{
public string Str1 { get; set; }
public string Str2 { get; set; }
}
然後我們在postman 訪問試試。我們看到,成功收到了str1和str2的值。
5.第五步
其實還有更簡單暴力的辦法,在路由中通過url中給引數指定值。
程式碼如下:
[HttpPost]
[Route("~/Post/{Str1}/{Str2}")]
public string Post(string Str1,string Str2)
{
return string.Format("第一個str是:{0},第二個str是{1}",Str1,Str2);
}
然後我們post的Url為http://localhost:56866/Post/123/456
結果如圖所示:
我們直接在url中按照路由規則給str1和str2指定了值,並且WebApi中的post函式成功獲取到了其值。
該i昂木的GitHub地址:https://github.com/liuzhenyulive/WebApiString
有什麼疑問歡迎留言與我交流。