首页»WEB综合»你所不知道的 POST

你所不知道的 POST

来源:zhangxiangliang 发布时间:2018-04-21 阅读次数:

 0.说明

  • 大叔 :二翔 我们要做一个微信公众号哦。我来教你大概的流程好不好?(开启装逼模式中 )
  • 二翔 :好啊,快讲快讲。(无限期待中 )
  • 大叔 :你知道 application/x-www-form-urlencoded是什么嘛?
  • 二翔 :啊咧咧?
  • 大叔 :你知道 php 怎么获得 raw?
  • 二翔 :啊咧咧?
  • 大叔 :用下面这种方法来实现。
    echo file_get_contents("php://input");
  • 二翔 :啊咧咧?
  • 二翔 :php://input是什么东西?
  • 大叔 :嘿嘿,自己去了解吧。

 1.无情浪子 POST

  编故事

  POST平常看起来人畜无害,但是有句话说的好。最可怕的不是鬼怪,而是人心(Content-Type)。POST在明面上,只有一个老婆叫做application/x-www-form-urlencoded,其实他一共有好几个伴侣。

  • 键值妹:application/x-www-form-urlencoded
  • 文件妹:multipart/form-data
  • 多胞胎:raw

    • text/plain
    • text/html
    • text/xml
    • application/json
    • application/xml
    • application/javascirpt

 2.辨别真心 Content-Type

  0.说明

  我们想知道POST心里装着的人是谁怎么办呢,这次请出感情专家 postman 来帮忙。

  1.application/x-www-form-urlencoded

  截图

  报文

POST  HTTP/1.1
Host: 127.0.0.1
Cache-Control: no-cache
Postman-Token: 4f2704aa-81e6-be22-4c36-8787ba945a22
Content-Type: application/x-www-form-urlencoded

name=lionis&sex=man

  服务端代码

<?php
    var_dump($_POST);

  输出

array(2) {
  ["name"]=>
  string(6) "lionis"
  ["sex"]=>
  string(3) "man"
}

  结论

  application/x-www-form-urlencoded是常用的表单发包方式,普通的表单提交,默认都是通过这种方式。 对于PHP用$_POST获得键值对。

  2.multipart/form-data

  截图

  报文

POST  HTTP/1.1
Host: 127.0.0.1
Cache-Control: no-cache
Postman-Token: f7640c52-6667-b4e8-aee8-02b0e1656969
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"

lionis
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="sex"

man
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avater"; filename=""
Content-Type: 


----WebKitFormBoundary7MA4YWxkTrZu0gW

  服务端代码

<?php
    var_dump($_POST);
    var_dump($_FILES);

  输出

array(2) {
  ["name"]=>
  string(6) "lionis"
  ["sex"]=>
  string(3) "man"
}
array(1) {
  ["avater"]=>
  array(5) {
    ["name"]=>
    string(36) "0CD0A5235EDCDAAB4AFE05B25695E696.png"
    ["type"]=>
    string(9) "image/png"
    ["tmp_name"]=>
    string(45) "/Applications/XAMPP/xamppfiles/temp/phpeFfc9e"
    ["error"]=>
    int(0)
    ["size"]=>
    int(9485)
  }
}

  结论

  multipart/form-data 用在发送文件的POST包。对于PHP用$_FILE获取文件内容,用$_POST获得键值对。

  3.raw

  截图

  报文

POST  HTTP/1.1
Host: 127.0.0.1
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 9e0c339b-a6b0-c534-5c62-63ef8dc887c4

{
    "user": "xieyuandong",
    "sex": "man"
}

  服务端代码

<?php
    var_dump(file_get_contents('php://input'));

  输出

string(47) "{
    "user": "xieyuandong",
    "sex": "man"
}"

  结论

  raw可以上传json,xml,文本等等。对于PHP用php://input获得内容。

 3.$_POST vs php://input vs HTTP_RAW_POST_DATA

  1.$_POST

  可以获 Content-Type 为 application/x-www-form-urlencoded 或者 multipart/form-data 的请求。

  2.HTTP_RAW_POST_DATA

  $POST不能获取的方式,都会存储在HTTP_RAW_POST_DATA,用$GLOBALS['HTTP_RAW_POST_DATA'] 接收。给内存带来的压力较大,并且需要 php.ini 设置。

  3.php://input

  允许读取 POST 的原始数据。给内存带来的压力较小,并且不需要 php.ini 设置。不能用于 enctype="multipart/form-data"。

  4.结论

  在php 7中已经取消了HTTP_RAW_POST_DATA,我们平时使用$POST和php://input就好了。

QQ群:WEB开发者官方群(515171538),验证消息:10000
微信群:加小编微信 849023636 邀请您加入,验证消息:10000
提示:更多精彩内容关注微信公众号:全栈开发者中心(fsder-com)
网友评论(共0条评论) 正在载入评论......
理智评论文明上网,拒绝恶意谩骂 发表评论 / 共0条评论
登录会员中心
类似于AG亚游网投