webapi引數傳遞總結
在webapi中,請求主體(httpcontent)只能被讀取一次,不被快取,只能向前讀取的流。
舉例子說明:
服務端方法: void action(int id, string name) // 所有引數都是簡單型別,因而都將來自url
服務端方法: void action([fromuri] int id, [fromuri] string name) // 同上
void action([frombody] string name); //[formbody]特性顯示標明讀取整個body為乙個字串作為引數
類定義:
public class customer
public int age
}服務端方法: void action(int id, customer c) // 引數id從query string中讀取,引數c是乙個複雜customer物件類戲,通過formatter從body中讀取
服務端方法: void action(customer c1, customer c2) // 出錯!多個引數都是複雜型別,都試圖從body中讀取,而body只能被讀取一次
服務端方法: void action([fromuri] customer c1, customer c2) // 可以!不同於上面的action,複雜型別c1將從url中讀取,c2將從body中讀取
4.modelbinder方式:
void action([modelbinder(mycustombinder)] sometype c) // 標示使用特定的model binder來解析引數
[modelbinder(mycustombinder)] public class sometype // 通過給特定型別sometype宣告標註[modelbidner(mycustombinder)]特性使得所有sometype型別引數應用此規則
void action(sometype c) // 由於c的型別為sometype,因而應用sometype上的特性決定其採用model binding
總結:1. 預設簡單引數都通過url引數方式傳遞,例外:
1.1 如果路由中包含了id引數,則id引數通過路由方式傳遞;
1.2 如果引數被標記為[frombody],則可以該引數可以為簡單引數,客戶端通過post方式傳遞:$.ajax(url, '=value'),或者$.ajax(});
2. 預設複雜引數(自定義實體類)都通過post方式傳遞,例外:
2.1 如果引數值被標記為[fromuri], 則該引數可以為複雜引數;
3. 被標記為[frombody]的引數只允許出現一次, 被標記為[fromuri]的引數可以出現多次,如果被標記為[fromuri]的引數是簡單引數,該標記可以去掉。
在客戶端呼叫webapi的一些介面時,最常使用到的http方式有get, post, put, delete四個,下面會將這四個分成兩類進行說明
delete在body中傳遞引數有爭議, 因此強烈建議只在url中傳遞引數,所以這個分類裡面只考慮通過url傳遞引數的情況。在url中可以傳遞多個引數,但總長度有url長度限制,引數之間使用&分隔,如以下格式:
http://localhost:12345/api/echo?arg1=value1&arg2=value2&arg3=中文
,其中的中文等特殊字元需要使用urlencode進行轉義,在webapi中接收的引數可以是多個單獨的引數,也可以是由多個引數封裝的物件(這個轉換會由框架自動完成)
例如:http://localhost:12345/api/echo/single?arg1=1&arg2=2
}post和put在引數傳遞時既可以在url中傳遞,也可以在body中傳遞,當然一起傳也是可以的,url傳遞符合上面所描述的情況,下面著重說一下在body中傳值的情況。
body正文只接收乙個引數的傳遞,但不限該引數是乙個值還是乙個物件,所以如果想要在body中傳遞多個引數,需要將這多個引數封裝成乙個物件
api中定義的接收方式(還有多種接收引數的方式,這裡只是用這一種方式進行舉例):
[route("single")]
public void post1([frombody]int arg1)
body中的正文:
1
api中定義的接收方式:
[route("single")]
public void post1([frombody]int arg1, [frombody]int arg2)
body中的正文(以json格式為例):
此種方式會導致伺服器報500錯誤,因為伺服器端不能正確解析所傳引數
api中定義的接收方式:
[route("singleobject")]
public void post2([frombody]arg arg)
若有多傳的值會被自動忽略掉
webapi引數傳遞總結
WebApi引數傳遞總結
在webapi中,請求主體 httpcontent 只能被讀取一次,不被快取,只能向前讀取的流。舉例子說明 服務端方法 void action int id,string name 所有引數都是簡單型別,因而都將來自url 服務端方法 void action fromuri int id,fromu...
傳遞多個引數並獲取Web API的資料
近段時間學習web api覺得非常有意思。預設的路由情況之下,獲取資料時,它不必指定action操作名。還有另外感想,就是自從學習asp.net mvc之後,加上jquery,讓insus.net已經慢慢遠離開asp.net,想起了那曾經得心應手的web控制項.前兩篇 asp.net mvc的web...
傳遞多個引數並獲取Web API的資料
近段時間學習web api覺得非常有意思。預設的路由情況之下,獲取資料時,它不必指定action操作名。還有另外感想,就是自從學習asp.net mvc之後,加上jquery,讓insus.net已經慢慢遠離開asp.net,想起了那曾經得心應手的web控制項.前兩篇 asp.net mvc的web...