国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

前后端聯(lián)調(diào)之Form Data與Request Payload,你真的了解嗎?

Fundebug / 3035人閱讀

摘要:前言做過前后端聯(lián)調(diào)的小伙伴,可能有時會遇到一些問題。它是請求中空行的后面那部分。這就是它向你展示的。值得形式是以的形式提交的。傳遞對象的時候,默認為類型的值,與非時,的區(qū)別。如果是字符串的話,后端解析的內(nèi)容時候,肯定要去解析啦。

前言

做過前后端聯(lián)調(diào)的小伙伴,可能有時會遇到一些問題。例如,我明明傳遞數(shù)據(jù)給后端了,后端為什么說沒收到呢?這時候可能就會就會有小伙伴陷入迷茫,本文從chrome-dev-tools(F12調(diào)試器)中看到的FormDataRequestBody,給小伙伴們提供一種可能的思路。也給小伙伴們提供一些問題的探究方法。

簡介

什么是FormData?什么是RequestPayload?不解釋,直接上圖:

區(qū)別?

因為這里觸及了我的知識盲區(qū),所以有了本文。這個答案是我在stackoverflow上得到的。首先還是貼問題,貼答案。

What"s the difference between “Request Payload” vs “Form Data” as seen in Chrome dev tools Network tab。
中文翻譯:chrome開發(fā)者工具中的Request Payload與Form Data有什么區(qū)別?

高票回答:

The Request Payload - or to be more precise: payload body of a HTTP Request - is the data normally send by a POST or PUT Request. It"s the part after the headers and the CRLF of a HTTP Request.

A request with Content-Type: application/json may look like this:

POST /some-path HTTP/1.1
Content-Type: application/json

{ "foo" : "bar", "name" : "John" }

If you submit this per AJAX the browser simply shows you what it is submitting as payload body. That’s all it can do because it has no idea where the data is coming from.

If you submit a HTML-Form with method="POST" and Content-Type: application/x-www-form-urlencoded or Content-Type: multipart/form-data your request may look like this:

POST /some-path HTTP/1.1
Content-Type: application/x-www-form-urlencoded

foo=bar&name=John

In this case the form-data is the request payload. Here the Browser knows more: it knows that bar is the value of the input-field foo of the submitted form. And that’s what it is showing to you.

So, they differ in the Content-Type but not in the way data is submitted. In both cases the data is in the message-body. And Chrome distinguishes how the data is presented to you in the Developer Tools.

翻譯過來是說:
Request Payload更準確的說是http request的payload body。一般用在數(shù)據(jù)通過POST請求或者PUT請求。它是HTTP請求中空行的后面那部分。(PS:這里涉及一個http常被問到的問題,http請求由哪幾部分組成,一般是請求行,請求頭,空行,請求體。payload body應該是對應請求體。)

一個請求伴隨著header設(shè)置為Content-Type: application/json時候,看起來可能像這樣:

POST /some-path HTTP/1.1
Content-Type: application/json

{ "foo" : "bar", "name" : "John" }

如果你正常請求一個ajax。瀏覽器會簡單的將你提交的內(nèi)容作為payload展示出來,這就是它所能做的,因為它不知道數(shù)據(jù)來自哪里。

如果你提交了一個html表單并且配置上了method="post",并且設(shè)置了Content-Type: application/x-www-form-urlencoded或者Content-Type: multipart/form-data。那么你的請求可能長這個樣:

POST /some-path HTTP/1.1
Content-Type: application/x-www-form-urlencoded

foo=bar&name=John

這里的form-data就是request payload。在這里,瀏覽器知道更多:它知道bar是提交表單的輸入字段foo的值。這就是它向你展示的。

所以區(qū)別就是,他們只是因為Content-Type設(shè)置的不同,并不是數(shù)據(jù)提交方式的不同,這兩種提交都會將數(shù)據(jù)放在message-body中。但是chrome瀏覽器的開發(fā)者工具會根據(jù)這個ContentType區(qū)分顯示方式。

細節(jié)

好了,到這里我們知道了,其實都是放到了payload中。那么具體有什么區(qū)別呢?為什么有時候后端拿不到值呢?這就不得不說對payload的解析方式了。我們以幾個chrome下的測試案例,來理一理這個邏輯。

傳統(tǒng)的Form表單提交 場景構(gòu)造

如果我這里點擊提交按鈕,就會觸發(fā)瀏覽器的提交功能,那結(jié)果是什么樣呢?

注意點

可以看到Content-Typeapplication/x-www-form-urlencoded
值得形式是以key1=value1&key2=value2的形式提交的。

傳統(tǒng)的ajax提交 場景構(gòu)造
function submit2() {
    var xhr = new XMLHttpRequest();
    xhr.timeout = 3000;
    var obj = {a: 1, b: 2};
    xhr.open("POST", "/");
    xhr.send(obj);
}

首先我們構(gòu)造一個簡單的函數(shù),然后觸發(fā)它。通過chrome反饋來看:

注意點

1.默認的Content-Typetext/plain
2.Request Payload會對非字符串做字符串轉(zhuǎn)換。
3.通過xhr.send(JSON.stringify(obj));可修正要發(fā)的內(nèi)容

axios方式提交 場景構(gòu)造

由于axios已經(jīng)是vue、react的準標配請求方式了,所以這里探究一下它。
首先我門看axios的文檔,當post提交時候可以傳遞什么類型參數(shù):

注意這個類型,我們分別構(gòu)造兩個場景。對應它。

function submit3() {
    var sence1 = "name=123&val=456";
    var sence2 = {name: 123, val: 456};
    axios.post("/", sence1)
}

分別傳遞字符串與對象,提交post請求,然后觀察結(jié)果:

場景1——傳遞字符串時候的結(jié)果:

場景2——傳遞對象的結(jié)果:

注意點

1.當我們傳遞字符串的時候,Content-Type自動轉(zhuǎn)為xxx-form-xxx的形式。當為對象的時候,自動轉(zhuǎn)化為xxx/json
2.字符串的時候以key1=val1&key2=val2的形式體現(xiàn),對象以JSON字符串形式體現(xiàn)。

總結(jié)

探索了這么多種情況之后,那么我們回顧一下:

Content-Type的差異

1.傳統(tǒng)的ajax請求時候,Content-Type默認為"文本"類型。
2.傳統(tǒng)的form提交的時候,Content-Type默認為"Form"類型。
3.axios傳遞字符串的時候,Content-Type默認為"Form"類型。
4.axios傳遞對象的時候,Content-Type默認為"JSON"類型

Content-Type的值,F(xiàn)orm與非Form時,payload的區(qū)別。

1.都只支持字符串類型(以上探究的幾種情況)
2.Form需要傳遞的格式為key1=value1&key2=value2,類似GET請求的QueryString格式
3.非Form一般為JSON.stringify(formDataObject)形式

后端取不到值?

無論何種形式傳遞,后端解析表單信息的時候,會考慮Content-Type。如果是JSON字符串的話,后端解析payload的內(nèi)容時候,肯定要去解析JSON啦。如果是key1=value1&key2=value2的形式,則需要去分割字符串。

當然這些事情一般后端使用的框架會去處理,但是框架給后端提供取值接口有可能是不同的,所以前端的小伙伴在處理請求問題時,一定要跟后端小伙伴商量好,是用JSON還是FormData哈。

后記

本來只是小小的一個問題,仔細研究起來發(fā)現(xiàn)挺多細節(jié)。今天就花時間整理了一下,希望能給大家一些幫助。碼字不容易,如果感到這篇文章對你有用。點個贊,收個藏唄。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/103261.html

相關(guān)文章

  • Dva + Ant Design 前后分離 React 應用實踐

    摘要:數(shù)據(jù)緩存對于一個應用來說,緩存是很重要的一步。所以,比較常見的方法就是將數(shù)據(jù)緩存在中。什么時候做數(shù)據(jù)緩存例用戶信息緩存參見在中配置了檢測中的是否存在。 源站鏈接 https://tkvern.com 繼 Rails 從入門到完全放棄 擁抱 Elixir + Phoenix + React + Redux 這篇文章被噴之后,筆者很長一段時候沒有上社區(qū)逛了。現(xiàn)在 tkvern 又回歸了,給...

    tainzhi 評論0 收藏0
  • 一個HTTP打趴80%面試者

    摘要:閱讀原文一個打趴面試者面試一年多,每當我問起面試者對的了解時,個個回答令我瞠目結(jié)舌,這些開發(fā)者都有年的經(jīng)驗。向指定資源提交數(shù)據(jù)進行處理請求例如提交表單或者上傳文件。 閱讀原文:一個HTTP打趴80%面試者 面試一年多,每當我問起面試者對HTTP的了解時,個個回答令我瞠目結(jié)舌,這些開發(fā)者都有3-5年的經(jīng)驗。請不要讓我叫你野生程序員,是時候了解HTTP了,讓我們當個正規(guī)軍。 起因 面試官:...

    econi 評論0 收藏0
  • ajax入門

    摘要:基于標準被廣泛支持。這樣的類最初是在中作為一個名為的對象引入的。請求還沒有被發(fā)送。當為,這個屬性返回目前已經(jīng)接收的響應部分。由服務(wù)器返回的狀態(tài)代碼,如表示成功,而表示錯誤。方法取消當前響應,關(guān)閉連接并且結(jié)束任何未決的網(wǎng)絡(luò)活動。 前言 總括: 本文講解了ajax的歷史,工作原理以及優(yōu)缺點,對XMLHttpRequest對象進行了詳細的講解,并使用原生js實現(xiàn)了一個ajax對象以方便日常開...

    Fundebug 評論0 收藏0
  • 跨域問題匯總

    摘要:因為瀏覽器的同源策略,前端開發(fā)會遇到各種跨域問題。前言在總結(jié)各種跨域問題之前,我們先來了解一下瀏覽器的同源策略。所以只能解決一級域名相同二級域名不同的跨域問題。 跨域問題的場景和解決方案多種多樣,只要是做前端開發(fā),總會遇到。而且面試時也是必問的問題。所以自己學習總結(jié)記錄一下。 因為瀏覽器的同源策略,前端開發(fā)會遇到各種跨域問題。本篇文章總結(jié)了遇到跨域問題的不同的場景以及對應的解決方案。 ...

    MkkHou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<