網站首頁 編程語言 正文
在這篇文章中,我們將學習WebAPI如何將HTTP請求數據綁定到一個操作方法的參數中。
操作方法在WebAPI控制器中可以有一個或多個不同類型的參數。它可以是基本數據類型或復雜類型。WebAPI根據URL的查詢字符串或請求主體中參數類型來綁定操作方法的參數。
如果參數類型是基本數據類型(int,double,string,DateTime,bool等),WebAPI默認將會從URL中獲取參數值(即通過querystring)獲取。
如果參數類型的復雜類型,WebAPI默認從請求主體中獲取參數值。
下表列出了Web?API參數綁定的默認規則。
HTTP方法 | Query?String | Request?Body |
---|---|---|
GET | 簡單類型 | 不能從請求主體中獲取參數值 |
POST | 簡單類型 | 復雜類型 |
PUT | 簡單類型 | 復雜類型 |
PATCH | 簡單類型 | 復雜類型 |
DELETE | 簡單類型 | 不能從請求主體中獲取參數值 |
我們先來看看創建帶MVC的Web?API項目時自動生成的Values控制器是如何定義的。
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace WebAPIContainMVC.Controllers { public class ValuesController : ApiController { // GET api/values public IEnumerableGet() { return new string[] { "value1", "value2" }; } // GET api/values/5 public string Get(int id) { return "value"; } // POST api/values public void Post([FromBody]string value) { } // PUT api/values/5 public void Put(int id, [FromBody]string value) { } // DELETE api/values/5 public void Delete(int id) { } } }
從Values控制器的定義中,我們可以得出如下幾個結論:
(1)WebAPI常規的方法有四個:Get(),Post(),Put()和Delete()。
(2)四種方法的參數可以歸納為兩大類:URL傳遞(Request-url)和Body(Request-body)傳遞。
(3)可以將四種方法的參數傳遞歸為兩大類,而這兩大類又集中在Get和Post中體現(Put是Get和Post的組合,Delete和Get類型),所以說研究WebAPI的參數綁定,只需要研究Get和Post方法的參數傳遞即可,Get對應Request-url,Post對應Request-Body。
在本篇文章中,客戶端調用使用Fiddler工具進行測試。
一、Get
1、基本數據類型作為方法參數
1.1方法只含有一個參數(形參可以傳遞進來)
方法定義如下:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using WebAPIContainMVC.Entity; namespace WebAPIContainMVC.Controllers { public class StudentController : ApiController { [HttpGet] public string GetStudentById(int id) { string strResult=string.Empty; Listlist = new List (); Student stu = new Student() { StudentId=1, Name="Tom", Age=20, Sex="男" }; list.Add(stu); list.ForEach(p => { if (p.StudentId.Equals(id)) { strResult = "存在該學生信息"; } else { strResult = "對不起,找不到該學生信息"; } }); return strResult; } } }
客戶端調用
結果:
雙擊左側的進程,得到如下的結果
1.2、方法含有多個參數(形參可以傳遞進來)
方法定義如下:
public string GetStudentByIdAndName(int id,string name) { string strResult = string.Empty; Listlist = new List (); Student stu = new Student() { StudentId = 1, Name = "Tom", Age = 20, Sex = "男" }; list.Add(stu); list.ForEach(p => { if (p.StudentId.Equals(id)&&p.Name.Equals(name)) { strResult = "存在該學生信息"; } else { strResult = "對不起,找不到該學生信息"; } }); return strResult; }
URL地址:http://localhost:63512/api/student?id=1&&name=Tom
結果如下:
2、實體對象類型作為方法參數(形參不能傳遞進來)
方法定義如下:
[HttpGet] public string GetStudent(Student student) { string strResult = string.Empty; Listlist = new List (); Student stu = new Student() { StudentId = 1, Name = "Tom", Age = 20, Sex = "男" }; list.Add(stu); if (student != null) { list.ForEach(p => { if (p.StudentId.Equals(student.StudentId)) { strResult = "存在該學生信息"; } else { strResult = "對不起,找不到該學生信息"; } }); } else { strResult = "參數值為Null"; } return strResult; }
客戶端調用結果如下:
3、基本數據類型和實體對象混合作為方法參數(基本數據類型可以傳遞進來,實體對象不能傳遞進來)
4、總結
(1)查詢字符串參數名稱和操作方法參數名稱必須相同(不區分大小寫)。參數的先后順序可以不一致。
(2)Get()參數傳遞的本質是URL字符串拼接,但是URL字符串的長度受限制。
(3)Get()的參數支持基本數據類型,不支持實體數據類型。
(4)Get()參數的傳遞是在Http請求的頭部傳遞,而不支持Request-Body傳遞。
(5)Get類型的方法命名,盡量采用“Get+方法名”的命名方式,在方法前面加上特性:[HttpGet]。
二、Post
1、Post參數傳遞是在Request-Body內傳遞。
2、Post參數可以傳遞基本數據類型,也可以傳遞實體數據類型。
3、Post操作方法只能包含一個實體數據類型,因為只能允許一個參數讀取Request-Body中的數據。
4、Post傳遞參數時,無論是基本類型參數還是實體類型,均需要借助[FromBody]特性。(有些情況下不寫[FromBody]特性也可以把參數傳遞進來,但為了規范化,最好是加上該特性)。
5、Post類型的方法命名,盡量采用“Post+方法名”的命名方式,在方法前面加上特性:[HttpPost]。
三、FromURI與FromBody
在默認情況下,WebAPI是從查詢字符串中得到基本數據類型參數的值,從請求主體中得到復雜類型參數的值,如果想改變這種默認情況怎么辦?
可以使用[FromURI]屬性,是WebAPI從查詢字符串中獲取復雜類型參數的值,使用[FromBody]屬性可以使WebAPI從請求主體中獲取基本數據類型參數的值。
例如下面的Get方法
[HttpGet] public string GetStudentById([FromUri]Student stu) { }
Get方法中包括復雜的類型參數,參數添加了[FromUri]屬性,WebAPI將試圖從查詢字符串中得到Student類型參數的值。
同樣,參考下面的Post方法:
[HttpPost] public string Post([FromBody]string name) { }
WebAPI將從請求主體中獲取基本類型參數的值,而不是從請求字符串中獲取。
原文鏈接:https://www.cnblogs.com/dotnet261010/p/8592067.html
相關推薦
- 2023-09-17 Could not initialize class net.sf.cglib.beans.Bean
- 2022-12-14 正則表達式匹配0-10的正整數以及使用細節_正則表達式
- 2023-05-09 Linux?解壓縮文件到指定目錄_linux shell
- 2022-05-17 springboot打包為jar
- 2022-12-26 kubernetes數據持久化StorageClass動態供給實現詳解_云和虛擬化
- 2022-05-06 golang-操作sqlite3增刪改查
- 2022-04-12 C#?實例解釋面向對象編程中的單一功能原則(示例代碼)_C#教程
- 2022-10-08 C++淺析函數重載是什么_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支