浏览器请求过程
请求头
请求行(请求方法 路径 协议)
请求头(格式:key:value)
(空行)
主体信息(可选)(发送内容)
例子:
POST /taskmgr/getTableList HTTP/1.1
Host: localhost
Connection: keep-alive
Content-type: application/x-www-form-urlencode
Content-length: 98
Accept: application/json, text/plain, */*
x-Requested-With:XMLHttpRequest
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=460dg9u06a14gn3qsqgf0gflse
tableTypeId=0&userName=&ownerType=2&cIsSubmit=-1&rIsSubmit=-1&startTime=&endTime=&start=0&limit=30
响应头
响应行(协议 状态码 状态文字)
响应头(key:value)
(空行)
主体信息(可选)
例子:
HTTP/1.1 200 OK
Content-type: text/html
Content-length: 5
hello
请求方法
方法 | 说明 |
---|---|
GET | 获取一个url指定的资源 |
HEAD | 获取一个指定的资源的信息 |
POST | 向服务器提交数据 |
PUT | 向服务器提交资源 |
DELETE | 请求服务器删除Request-URL标识的资源 |
TRACE | 网络跟踪 |
CONNECT | 与proxy之间的连接管理 |
OPTIONS | 查询服务器支持的方法 |
状态码
状态码 | 定义 | 说明 |
---|---|---|
1XX | 请求被接受 | 一般只在实验环境下使用,websocket的协议也是1XX系列的 |
2XX | 成功 | 操作成功 |
3XX | 重定向 | 为了完成请求,采取进一步措施。nginx的负载均衡经常用到303、304 |
4XX | 客户端错误 | 请求语法有错或不能完全被满足 |
5XX | 服务端错误 | 服务器无法完成有效的请求 |
常见状态码
状态码 | 说明 |
---|---|
200 | 请求成功 |
301 | 永久重定向,浏览器地址栏也会变 |
302 | 临时重定向,浏览器地址保持不变 |
304 | not modified 未修改 |
307 | 重定向中保持原有的请求数据,比如nginx反向代理、vpn代理, |
404 | 资源未找到 |
503 | 服务器暂时不可用,访问量过大时可能会出现,500也是 |
500 | 服务器内部错误 |
用Telnet连接
> telnet localhost 80
按下 ctrl + ]
欢迎使用 Microsoft Telnet Client
Escape 字符为 'CTRL+]'
Microsoft Telnet>
再按下回车,显示全黑页面,进行输入即可
GET请求
GET /test.php HTTP/1.1
host:localhost
POST请求
post请求要指定Content-type和Content-length
POST /test.php HTTP/1.1
host:localhost
content-type:application/x-www-form-urlencoded
content-length:5
id=12
telnet模拟文件上传
test.php
<?php
echo move_uploaded_file($_FILES['myfile']['tmp_name'], './'.$_FILES['myfile']['tmp_name']) ? 'success':'failed';
telnet输入下面内容,其中boundary是文件内容的边界,随便自定义。浏览器上传文件其实也是这样,把文件内容用定界符包起来作为body部分再发送
POST /test.php HTTP/1.1
host:localhost
content-type:multipart/form-data,boundary=AaB03x
content-length:140
--AaB03x
Content-Disposition:form-data; name="myfile"; filename="a.txt"
Content-Type:text/plain
wo hen shuai
--AaB03x--
COOKIE
请求中发送cookie
test.php
<?php
if($_COOKIE['name'] == 'admin'){
echo 'success'
} else {
echo 'failed';
}
telnet
GET /test.php HTTP/1.1
host:localhost
cookie:name=admin
使用fsockopen()打开连接来发送请求
<?php
$f = fsockopen('localhost', 80, $err, $errMsg); // 返回的是文件句柄
// 发送请求
$content = [
'GET /test.php HTTP/1.1',
'host:localhost',
'cookie:name=admin',
'',''
];
$content = implode("\n", $content);
fwrite($f, $content);
// 接收响应
while($str = fread($f, 32)){
echo $str;
}
fclose($f);