天天看點

php 擷取HTTP POST中不同格式的資料

HTTP協定中的POST 方法有多中格式的資料協定,在HTTP的head中用不同的

Content-type

辨別.常用的有

application/x-www-form-urlencoded

,這是最常見的,就是from表單的格式.在HTTP的head中是

Content-Type: application/x-www-form-urlencoded

.

multipart/form-data

,這個是用來上傳檔案的,在HTTP的head中是

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

Raw

這個不是特别常用,傳輸的資料在HTTP的body中隻有一段,不是以鍵值對的形式存放.在HTTP的head中是

Content-Type: application/json

,

Content-Type: text

Content-Type: application/xml

Content-Type: text/xml

,等等形式

對于

Content-Type: application/x-www-form-urlencoded

這種form表單的資料,在php中,使用

$_POST['name']

可以直接擷取, 沒有什麼特别的

Content-Type: multipart/form-data;

這種格式的資料,在php中使用

$_POST['name']

可以擷取字元資料,使用

$_FILES['file']

可以擷取.

Raw

這種格式的資料,使用以上兩種辦法沒有辦法擷取到,需要使用别的手段.

1.使用

file_get_contents("php://input")

擷取;寫一個簡單php檔案測試一下

<?php
$test=file_get_contents("php://input");
echo $test;           

用postman測試一下

沒問題,可以接收到

2.使用

$GLOBALS['HTTP_RAW_POST_DATA']

接收

<?php
$test=$GLOBALS['HTTP_RAW_POST_DATA'];
echo $test;           

卧槽,竟然出錯了,提示沒有發現HTTP_RAW_POST_DATA這個數組索引,什麼鬼.Google一番,在php的官網看到了這樣一段話

原來HTTP_RAW_POST_DATA這個在php5.6中已經被廢棄了,在php7.0以後的版本中已經被删除了,我用的php版本為7.2,肯定就出錯了

好吧,那就老老實實的用

file_get_contents("php://input")

擷取吧

在實際開發中,一般都是使用架構的,我用thinkphp用比較多,在tp5.0中可以使用

Request的getInput()

函數擷取

Raw

中的資料

<?php

namespace app\index\controller;

use think\Request;

class Index
{
    public function index(Request $request)
    {
        echo $request->getInput();
    }
}           

測試一下

沒有問題,可以正常擷取

關于php擷取HTTP POST資料的方法先介紹到這裡