前後端資料傳參詳解

2021-09-24 18:32:20 字數 3256 閱讀 6685

uri傳參

資料引數寫在uri位址中,可以為查詢引數,也可以為路徑引數,一般get請求方式用的多。

優點:乙個tcp傳輸就可以將引數傳遞給伺服器,速度快。

缺點:引數直接暴露在瀏覽器中,不安全。

body傳參

資料引數寫在body體中,有多種content-type格式:json、xml、form-data,一般post請求方式用的多。

優點:相對安全,沒有大小限制。

缺點:需要兩個tcp傳輸,第一次傳輸head,第二次傳輸body。

注意,上面說的post和get,並不是說post只能用body傳參,get只能用uri傳參,實際上,想怎麼傳參是我們碼農自己定的,你可以在post中新增uri引數,也可以在get方式中新增body引數,只是這樣做的話,不符合規範,而且很多伺服器是按照規範來自定解析方法的,比如:有些伺服器會幫你解析,讀出body資料,而有些伺服器直接忽略,所以,雖然get可以帶request body,但不能保證一定能被接收到。這裡有個post和get的區別的文章: 寫得很好。

我們知道restful下常用的幾種http請求方式為get、post、put、patch、delete,我們首先要明確一點,http請求方式只是一種約定俗成的規範,因為只要後端對前端發來的get請求做了post該做的事,實際上就是get也完成了post的功能。

正是因為有了這種規範,所以後端開發人員在寫不同的api介面時,就要注意自己的方法是否符合當前的http請求方式。比如註冊使用者這個api,是要建立乙個使用者到資料庫的,這是乙個非冪等操作,自然要使用post方式(實際上後端使用get方式也能實現,但是正因為有了這種規範就不推薦使用)。所以歸根結底,前後端互動時的http的請求方式,是看我們後端在一定的規範約束之內怎麼實現http操作方法,如何定義http路由,如何定義資料互動格式。

下面我們一一來看這幾種請求方式。

get 獲取資源

post 建立資源

put 建立或更新資源(有則更新,無則建立)

例如 put /items/1 的意思是替換 /items/1 ,存在則替換,不存在則建立。

所以,put方法一般會用來更新乙個已知資源。

patch 部分更新資源

delete 刪除資源

multipart/form-data

也是瀏覽器的原生 form 表單格式,與上面不同的是,這個既可以傳鍵值對,也可以用來上傳檔案。我們使用表單上傳檔案時,必須讓 form 的 enctyped 等於這個值。

對於其具體格式,我們來看一下它的請求示例:

------webkitformboundaryrgkcby7qhfd3trwa--實際上對於每乙個boundary都是乙個鍵值對,可以包含多種不同的資料型別,可以是text、png

、二進位制檔案流等。

//檔案上傳表單
//axios處理

var vm = new vue(,

result: '',

},methods: ,

upload: function () //注意這裡要修改請求頭的content-type屬性

}).then(function (res) );

}, function (res) );

}}});

當然後端也要清楚傳過來的是什麼格式的資料,對於不同的資料,後端採用的接收資料的方法也不同。比如,如果前端傳過來的是乙個檔案資料,你還是用普通的就收方式處理,那肯定會出錯。

一般來說這些後端框架,肯定會有相應的內建檔案接收解析物件(或者說是介面-如multipartfile,暴露給開發人員自定義實現檔案物件)。

舉個例子,spring中,你需要使用@requestparam() multipartfile來接收檔案物件,如果你還是使用@requestbody來進行接收,肯定會出錯。

先說一下我們網路中基本上傳輸的都是字串型別,並不是我們以為的傳的是個物件。就拿現今最流行的json來說,前後端在網路互動資料流中,接收到的對方資料並不是json物件,而是乙個json格式的字串,所以前後端都需要對json字串解析,一般來說,我們會在請求響應的最前端進行攔截並處理。現在許多框架已經在其端點filter中自動幫我們我們做了這一轉換。

現在我們再看一下具體的後端處理前端傳參的例子。

先要說明一下,我們要關注的是註解(.net中叫特性)和傳參方式(uri傳參、body傳參)的對應關係,而不是和http請求方式的對應關係。因為http請求方式只是乙個資料操作規範,對於這兩種傳參方式它都可以實現。

比如 .net 中:

再比如spring boot中:

uri引數

public void demo(@pathvariable(name = "id") string id, @requestparam(name = "name") string name)

body引數(context-type)

public void demo1(@requestbody person person)

無註解 或者 @requestparam

獲取並解析body中的multipart/form-data和x-www-form-urlencoded

multipart/form-data既可以用做檔案資料的傳輸也可以做鍵值對的傳輸(一般做檔案傳輸的時候都要使用這種格式)

x-www-form-urlencoded只能用做鍵值對

public void demo2(person person)

springmvc通過使用handleradapter 配置的httpmessageconverters來解析httpentity中的資料,然後繫結到相應的bean上

Spring MVC前後端的資料傳輸

本篇文章主要介紹了spring mvc中如何在前後端傳輸資料。在spring mvc中這主要通過model將資料從後端傳送到前端,一般的寫法為 public string index model model 首先需要定義乙個model,然後為model新增屬性,並繫結資料,最後將model新增到檢視...

前後端渲染詳解

訪問網頁時,先請求到 html 內容,並渲染出來。然後根據需要傳送 ajax 請求獲取後台返回的資料來更新頁面。區域性重新整理。無需每次都進行完整頁面請求 懶載入。如在頁面初始時只載入可視區域內的資料,滾動後rp載入其它資料,可以通過 react lazyload 實現 富互動。使用 js 實現各種...

springMVC前後端資料傳遞出現的問題

markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細語法參考幫助?本編輯器支援markdown extra,擴充套件了很多好用的功能。具體請參考...