周大胖子 发表于 2018-12-6 23:20:08

深入解析 胖爷忘掉的基础头部信息php版


请求行、请求头、请求体
代码讲解模式:
1. 模拟解析 客户端向服务器发送 GET 请求 【 重点 : GET 请求是没有请求体的;一般展示之展示 响应体中的内容】
<?php

    // 1.创建sock连接
    $fp = fsockopen('localhost',80 ,$error ,$errstr ,10);   

    // fsockopen(本地标识,端口号,$error , $errstr , 超时时间);
    // $error 错误编号 ,这是一个引入的性质,用来存放 错误编号
    // $errstr 错误信息
    // 10 表示10秒 ,如果10S没成功就断开连接
   

    // 检测       如果连接失败 就打印出 失败信息
    if(!$fp){
      echo $errstr;die;
    }

    // 拼接http请求报文
    $http = '' ;    // 先声明 留着拼接
   
    // 请求报文 包括三个部分1.请求行 ; 2. 请求头3.请求体
   
    // 请求行
    $http .="GET /larveral/server.php HTTP/1.1\r\n";   
    // 第一个是请求方式
    // 第二个请求文件的绝对位置相对域名
    // 第三部分 协议的版本号 必须加 \r\n[注意外层必须使用双引号 否则不解析
\n]
    // 可以在这传递信息 $http .="GET /larveral/server.php?a=1&b=2 HTTP/1.1\r\n";利用$_GET 接收
   

    // 请求头信息
    $http .= "Host: localhost\r\n" ;    //被请求的主机名
    $http .= "Connection: close\r\n\r\n";   
   //表示创建完链接后 立即关闭 ; 还有一个值是 keep-alive 表示不断开通道可以提高请求速度
   // 如果到这请求头完毕 就加两段\r\n
   
    // 请求体 无get请求无请求体post请求则携带请求体
   

    // 发送请求   向流中写入信息
    fwrite($fp, $http);


    $res ='    // 获取结果读一段就拼接一段 没到结尾就继续阅读拼接
    while(!feof($fp)){
      $res .= fgets($fp);
    }

    // 返回内容给浏览器
    echo $res;


GET的服务器端响应信息


    // 响应的结果【】
    //
    // HTTP/1.1 200 OK            响应行   协议号 与状态码
    // Date: Thu, 06 Dec 2018 14:22:40 GMT   响应头
    // Server: Apache/2.4.9 (Win64) PHP/5.5.12         
    // X-Powered-By: PHP/5.5.12
    // Content-Length: 10
    // Connection: close
    // Content-Type: text/html

    // I love you响应体响应整个过程 响应回来的一共有三个部分 响应行、响应头隐藏只有响应体显示了


再来个POST版
<?php

    // 1.创建sock连接
    $fp = fsockopen('localhost',80 ,$error ,$errstr ,10);   

    // 检测       如果连接失败 就打印出 失败信息
    if(!$fp){
      echo $errstr;die;
    }

    // 拼接http请求报文
    $http = '' ;    // 先声明 留着拼接
   
    // 请求行
    $http .="POST /larveral/server.php HTTP/1.1\r\n";   
    // 第一个是请求方式

    // 请求头信息
    $http .= "Host: localhost\r\n" ;   
    $http .= "Connection: close\r\n";   

    $http .= "Cookie: username=admin;uid=200\r\n";      //存储的cookie
    $http .= "User-agent: Chrome/67.0.3396.99 Safari/537.36\r\n";      
   //这是客户端标识 谷歌、火狐、安卓、IOS都不一样
    $http .= "Content-type: application/x-www-form-urlencoded\r\n";   
   //例如ajax向服务器发送一个post请求 如果没有这句话$_POST就拿不到数据   得用超全局变量 $GLABALS 的 HTTP_RAW_POST_DATA 中
    $http .= "Content-length:33 \r\n\r\n";   // 请求长度请求体中有多长 这就写多长 下面不加\r\n 是33


    // 请求体
    $http .="email=laomo@qq.com&username=admin\r\n";


    // 发送请求   向流中写入信息
    fwrite($fp, $http);


    $res ='    // 获取结果读一段就拼接一段 没到结尾就继续阅读拼接
    while(!feof($fp)){
      $res .= fgets($fp);
    }

    // 返回内容给浏览器
    echo $res;


POST的 服务器结构
<?php
   
    // 1.打印$_post 的结果有没有过来
    // var_dump($_POST);
   

    // 打印cookie
    // var_dump($_COOKIE);
   



    // 打印serve的内容
    // var_dump($_SERVER);
   // 看见这个$_SERVER 的值,可以模拟很多东西


    // 超全局变量 $GLOBALS
    var_dump($GLOBALS);





页: [1]
查看完整版本: 深入解析 胖爷忘掉的基础头部信息php版