form data 與request payload的區別以及php接收這些數據的方法


 

form data 與request payload的區別以及php接收這些數據的方法

以前與前端交互一直都是POST、GET的,PHP端就直接$_POST,$_GET來接收,從來沒有出現過以外。

最近還是按這個思維,前端那邊說有請求過,可是我這邊卻沒有數據,調試了很多次,最后直接讓那邊前端給截圖看他給我傳的參數了,截圖過來后,在header里,沒有form data,數據卻都在request payload里。

后來了解到,造成這種問題的原因是Content-Type的類型的不同。

一,Content-Type的理解

 

Content-Type是指http/https發送信息至服務器時的內容編碼類型,contentType用於表明發送數據流的類型,服務器根據編碼類型使用特定的解析方式,獲取數據流中的數據。

在網絡請求中,常用的Content-Type有如下:
text/html, text/plain, text/css, text/javascript, image/jpeg, image/png, image/gif, 
application/x-www-form-urlencoded, multipart/form-data, application/json, application/xml 等。

其中:text/html, text/plain, text/css, text/javascript, image/jpeg, image/png, image/gif, 都是常見的頁面資源類型。

application/x-www-form-urlencoded, multipart/form-data, application/json, application/xml 這四個是ajax的請求,表單提交或上傳文件的常用的資源類型。

form表單中可以定義enctype屬性,該屬性的含義是在發送到服務器之前應該如何對表單數據進行編碼。默認的情況下,表單數據會編碼為 
"application/x-www-form-unlencoded".

enctype常用的屬性值如下:application/x-www-form-unlencoded: 在發送前編碼所有字符(默認情況下);
multipart/form-data, 不對字符編碼。在使用文件上傳時候,使用該值。

一:application/x-www-form-urlencoded 主要用於如下:
1.1: 最常見的POST提交數據方式。
1.2:原生form默認的提交方式(可以使用enctype指定提交數據類型)。
1.3:jquery,zepto等默認post請求提交的方式。

首先來看下form表單中post默認提交方式的數據;代碼如下:

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <meta charset="utf-8">
</head>
<body>
  <div id="app">
    <form action="http://www.example.com" method="POST">
      <p>username: <input type="text" name="fname" /></p>
      <p>age: <input type="text" name="age" /></p>
      <input type="submit" value="提交" />
    </form>
  </div>
</body>
</html>

結果如下圖所示:

此時Content-Type為application/x-www-form-urlencoded,數據結構為form data,這種數據接口如果是post方式傳送的php端可以用$_POST獲取,get就可以用$_GET方式提交,當然也是可以用$_REQUEST來獲取。

 

二:multipart/form-data
使用表單上傳文件時,必須指定表單的 enctype屬性值為 multipart/form-data. 請求體被分割成多部分,每部分使用 --boundary分割;

html代碼如下:

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <meta charset="utf-8">
</head>
<body>
  <div id="app">
    <form action="http://www.example.com" method="POST" enctype="multipart/form-data">
      <p>username: <input type="text" name="name" /></p>
      <p>age: <input type="text" name="age" /></p>
      <input type="submit" value="提交" />
    </form>
  </div>
</body>
</html>

 

三:application/json

html代碼如下:

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <meta charset="utf-8">
  <script type="text/javascript" src="./jquery-1.11.1.min.js"></script>
</head>
<body>
  <div id="app">
    <div class="btn">發送post請求</div>
  </div>

  <script>
    $('.btn').click(function() {
      $.ajax({
        url: 'http://localhost:8081/api.json',
        type: 'POST',
        dataType: 'json',
        contentType: 'application/json',
        data: JSON.stringify({a: [{b:1, a:1}]}),
        success: function(d) {
          
        }
      })
    });
  </script>
</body>
</html>

結果如下圖所示:

如上我們可以看到json格式提交的數據會顯示 Request Payload;

二,php接收request payload的數據的方法

在PHP端接收參數使用的是:

$data = file_get_contents( "php://input");
$data = $GLOBALS['HTTP_RAW_POST_DATA'];

意思很簡單明了,設置 contentType 為 text/plain; charset=utf-8 ,請求的數據實際就是以文本形式放在請求頭里。而如果使用 application/x-www-form-urlencoded ,就是以form表單的形式請求。

實際上,request payload 用的地方也很多,比如想傳json做參數的時候。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM