|
请求行、请求头、请求体
代码讲解模式:
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);
复制代码
|
|