1. 程式人生 > >ASP.NET WebAPI String 傳值問題

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

有什麼疑問歡迎留言與我交流。