1. 程式人生 > >Web API,從簡單型別到複雜型別的引數傳遞用例,以及傳遞簡單string型別的解決辦法

Web API,從簡單型別到複雜型別的引數傳遞用例,以及傳遞簡單string型別的解決辦法

http://www.cnblogs.com/kvspas/p/3384448.html

一,簡單型別的傳值

比如 public Users Get(int id) ,它可以使用兩種方式獲取:

  • api/default/5
  • $.get("/api/default",{id:90}, function (data) {/* 處理邏輯 */});

前者不需要註明引數名,後者適用於存在多個簡單引數的情況,例如比較實際的案例以及對應的獲取方式是:

  • public Users Get(int idint id2)
  • $.get("/api/default",{id:90,id2:88}, function (data) {});

二,簡單型別傳值中涉及到string的傳遞

對於簡單型別的引數傳值,唯一有一點可以稱得上是問題的問題,便是遇到例如:public string Post(string v) 這樣的情況,如果你直接post一個引數名為v的字串過去,例如:$.post("/api/testString",{ v: "i want testString" }, function (data) {}); ,那麼結果是無功而返的:

通過搜尋stackoverflow以及encosia(詳見這裡),下面是解決方案:

首先為引數覆蓋上[FromBody]特性,比如 public string Post([FromBody]string v),然後:

  • 解決方案1:$.post("/api/testString", "=i want testString"
     , function (data) {}); //在前面加一個等於號
  • 解決方案2:$.post("/api/testString",{ "": "i want testString" }function (data) {}); //傳遞一個空引數名

問題是解決了,可是本人也嘮叨一句:這像什麼話。

誠然道有些朋友會說“Web API不是這樣使用的,它是為某某某情況……你應該構造一個物件……”,但是,既然存在如此的使用情況,本文所針對就是可能出現的問題而作出解決方案。

三,傳遞複雜型別:

首先定義兩個型別,

複製程式碼
    public class Users
    {
        public
int uid { get; set; } public string username { get; set; } }
複製程式碼 複製程式碼
    public class DoubleStringPrameter
    {
        public string Pram1 { get; set; }

        public string Pram2 { get; set; }
    }
複製程式碼

對於需要傳送兩個字串引數的情況,必須傳遞一個物件了:

  • public string Post(DoubleStringPrameter pram)
  • $.post("/api/testStringUsingObject", { Pram1: "引數1的值", Pram2: "引數2的值" }, function (data) {}); //不需要指定引數名

而對於需要傳遞更加複雜的物件,例如同時傳遞 DoubleStringPrameter 和 Users ,就需要這麼封裝:

複製程式碼
    public class using2ObjController : ApiController
    { 
        public string Post(IMultiObj obj)
        {
            return "uid:" + obj.User.uid + ",username:" + obj.User.username + "||pram1:" + 
                obj.StringPrameter.Pram1 + ",pram2:" + obj.StringPrameter.Pram2;
        } 
    }

    public class IMultiObj //定義一個型別封裝
    {
        public DoubleStringPrameter StringPrameter { get; set; }

        public Users User { get; set; }
    }
複製程式碼

然後這麼傳遞:

      $.post("/api/using2Obj", { User: { uid: '80909', username: 'amazon' }, StringPrameter: { Pram1: '引數1的值', Pram2: '引數2的值' } },

  function (data) {});

對於簡單型別傳值中涉及到string的傳遞,本人的意見是:作為一個API,如果提供了某些功能,那麼就必須實現,如果做不到或者不願意做,就應該在編譯期間斷絕問題發生的可能(就不應該讓 Post(string a)、Post(string a, string b)、Post(Users  u1, Users u2) 通過編譯),而不應是在使用期間採取對使用者做出 “方言” 級的限制,這已經有違強型別語言的設計初衷,試想這樣的情況:某一夜某個零時工打瞌睡寫了Post(Users  user, Content content),編譯過去了,一個月後客戶端那邊都已做了2萬行程式碼,到時候才說不能這樣使用(不能用你還寫出來幹什麼),這便是設計上的失職了。

如今這些不是問題的問題在2.0上依然存在,它既是Bug,同時也不是Bug。

對此本人更偏向於使用WCF或MVC的return Json(),出於Web API的問題本身,而作此文。