WebApi中的引數傳遞

2021-09-12 06:26:45 字數 3499 閱讀 5012

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...