HTTP(一)

http
php
http请求

HTTP请求:请求行、消息报头、请求正文。格式如下:

Method Request-URI HTTP-Veraion CRLF

参数说明

  • Method 请求方法
  • Request-URI 一个统一资源标识符
  • HTTP-Version 请求的HTTP协议版本
  • CRLF 回车和换行

响应:状态行、消息报头、响应正文

HTTP-Version Status-Code Reason-Phrase CRLF

参数说明

  • HTTP-Verson 服务器HTTP协议的版本
  • Status-Code 服务器发回的响应状态码
  • Reson-Phrase 状态代码的文本描述
  • CRLF 回车和换行

响应状态码:

  1. 1XX:指示信息——请求已接收、已处理
  2. 2XX:成功——请求已被成功接收、理解、接收
  3. 3XX:重定向——要完成请求必须进行更进一步的操作
  4. 4XX:客户端错误——请求有语法错误或请求无法实现
  5. 5XX:服务端错误——服务端未能实现合法的请求

常见状态码

  • 200 OK:客户端请求成功
  • 400 Bad Request:客户端请求有语法错误,不被服务器所理解
  • 401 Unauthorize:请求未经授权,此状态码必须和WWW Authenticate 报头域一起使用
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务
  • 404 Not Found:请求资源不存在
  • 500 Internal Server Error :服务器发生不可预期的错误
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常

相关函数:

get_headers(string $url [, int $format = 0 ] ) — 取得服务器响应一个 HTTP 请求所发送的所有标头

返回包含有服务器响应一个 HTTP 请求所发送标头的索引或关联数组,如果失败则返回 FALSE 。 (通过判断状态码是否为200,就可以判断请求的资源存在与否)

telnet模拟请求

  1. cmd ->telnet localhost(域名) 80
  2. 按下crtl+] ,仔按下enter (打开回显功能)
3. 发送报文
GET /test/httptest.php?id=1 HTTP/1.1
Connection: close
Host: localhost
Content-type:application/x-www-form-urlencoded
content-length:20
(两个回车)
#通过1.1版本协议请求index.html页面;connection: close是实用短连接,即服务器返回后就断开连接;Host字段知名页面所在的主机名。

测试服务端 httptest.php

<?php

	$dataGet = $_GET;
$dataPost = $_POST;
$dataGetstr = http_build_query($dataGet);
$dataPoststr = http_build_query($dataPost); if( $dataGet ){
echo 'get '.$dataGetstr;
} if( $dataPost ){
echo 'post '.$dataPoststr;
}
?>

PHP实现HTTP请求

$postData =http_build_query(
array(
'title' => "这里是 file_get_contents 提交的数据",
'content' => "你好 !",
'type' => 1
)
); #file_get_contents
$opts = array(
'http' =>array(
'method' => "POST" ,
'header' => "Host:localhost\r\n".
"Content-type:application/x-www-form-urlencoded\r\n".
"Content-length:".(strlen($postData))."\r\n".
"Cookie: foo=bar\r\n",
"content" => $postData,
//'timeout' => 60 * 60 // 超时时间(单位:s)
)
); $context = stream_context_create ( $opts );//创建数据流上下文 //file_get_contents( 'http://localhost/test/httptest.php',false,$context ); #fopen
$postData = http_build_query(
array(
'title' => "这里是 fopen 提交的数据",
'content' => "你好 !",
'type' => 1
));
$fp = fopen( 'http://localhost/test/httptest.php','r',false,$context );
  • stream_context_create 创建并返回一个文本数据流并应用各种选项,可用于fopen(),file_get_contents()等过程的超时设置、代理服务器、请求方式、头信息设置的特殊过程。

curl方式提交

$url = "http://localhost/test/httptest.php";
$postData = http_build_query(
array(
'title' => "这里是 fopen 提交的数据",
'content' => "你好 !",
'type' => 1
));
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL,$url );
curl_setopt( $ch,CURLOPT_POST,1 );
curl_setopt( $ch,CURLOPT_POSTFIELDS,$postData );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER,1 );
curl_exec();
curl_close();

socket方式提交

$postData = http_build_query(
array(
'title' => "这里是 fopen 提交的数据",
'content' => "你好 !",
'type' => 1
));
$fp = fsockopen( "localhost",80,$errno,$errorStr,5 );
$request = "POST http://localhost/test/httptest.php HTTP/1.1\r\n";
$request .= "Host:localhost\r\n";
$request .= "Content-type:application/x-www-form-urlencoded\r\n";
$request .= "Content-length:".(strlen($postData))."\r\n";
$request .= $postData;
fwrite( $fp,$request ); while(!feof($fp)){
echo fgets($fp,1024);
}
fclose($fp);

-- 这段时间读读书,理解理解原理,生活也很充实。

随机推荐

  1. LinuxShell脚本基础 6-case...esac的使用和通配符

    1.case...esac的使用 #!/bin/bash echo "请输入编号 选择不同的显示文件和目录方式:" echo "1 - 普通显示" echo & ...

  2. linux install tomcat

    折腾了好久,按照官网的安装流程安装了不止3次,发现还是不能成功,最终发现是linux机器本身的问题,因为我用的公司的virtual machine,可能是机器本身在一次迁移的过程当中出现了问题,导致了 ...

  3. Node.js Express4.x生成程序骨架

    express 4.x版本中将命令工具分出来了,需要再安装一个命令工具,执行命令“npm install -g express-generator”完成后再测试就可以了. 最后通过"expr ...

  4. XPath语法简介

    XPath是一种在xml中查找信息的语言,具体可参考W3school XPath教程 XPath是以路径表达式来选择XML文档中的节点或节点集 === XPath节点(Node) 在 XPath 中, ...

  5. 垂直居中问题不只有 line-height 可以解决,还有一个哥们叫 margin-top

    我们都知道,对于一行文本的垂直居中可以通过设置 height 与 line-height 值相等来实现. 那么对于两个嵌套的div ,或者一个div中的多行文本,怎么让被包含的部分实现垂直居中呢?显然 ...

  6. Beta阶段个人总结

    Beta阶段个人总结 这一次的项目在提出项目时有很大的信心能做好,但最后结果却不尽人意.由于这次的项目一开始目标是利用Android studio构建客户端然后电脑上连接数据库,在初期还未发现什么问题 ...

  7. 架构实战项目心得(十一):基于spring-security-oauth2的mysql数据表设计

    一.建立数据库及数据表结构 CREATE SCHEMA IF NOT EXISTS `oauth2` DEFAULT CHARACTER SET utf8 ; USE `oauth2` ; -- -- ...

  8. Backbone之温故而知新1-MVC

    在忙碌了一段时间之后,又有了空余时间来学习新的东西,自从上次研究了backbone之后,一直不得入门,今天有时间有温故了一次,有了些许进步在此记录下, 在开始之前,不得不提一下我的朋友给了我“豆瓣音乐 ...

  9. dns-prefetch使用整理

    网站投放百度.谷歌联盟广告,百度分享.推荐等,由于不同的DNS请求,会增加了网页加载时间,用户等待时间过长会造成跳出率增高,对SEO有一定影响. DNS解析速度是造成页面延迟加载的最大的原因. DNS ...

  10. 2017年12月17日 ASP.NET 12个表单元素&&简单控件/复合控件

    12个表单元素可以分为三大类 第一类:文本类 <input type = "text" /> //普通文本框 <input type = "passwo ...