php学习笔记08:HTTP协议

http协议

参考:HTTP教程-菜鸟教程

http协议初步认识

http协议概念

http协议特点

http协议分类

1. http请求协议:浏览器向服务器发起请求的时候需要遵循的协议.

2. http响应协议:服务器向浏览器发起响应的时候需要遵循的协议

http请求

  • 请求行

 形式: 请求方式 资源路径 协议版本号

 get /index.php HTTP/1.1

请求行独占一行 且是第一行.

  • 请求头

请求头就是各项协议内容:具体的协议内容不会每次都使用全部

1. host: 请求的主机地址(必须)

2. accept: 当前请求能够接收服务器返回的类型(MIME类型)

3. accept-Language: 接收的人类语言

4. user-agent: 客户浏览器所在电脑的一些信息:

请求头不固定数量,每个请求协议独占一行,最后会有一行空行,用来区分请求头和请求体.

  • 请求体

请求数据:post请求会有请求体.get请求的数据都是跟在url之后,会在请求行中的资源路径上体现.

基本格式: 资源名字=资源值&资源名字=资源值&...

http响应

  • 响应行

1. 形式: 协议版本号 状态码 状态消息(独占一行)

2. 200 ok: 成功

3. 403 forbidden: 没权限访问

4. 404 not found: 未找到页面

5. 500 server internal error: 服务器内部错误

  • 响应头

1. 时间:Date: Sun, 14 Jul 2019 14:11:34 GMT

2. 服务器:Server: nginx

3. 内容长度: 数据的具体字节数(响应体)

4. 内容类型:text/html; charset=UTF-8 告诉浏览器对应的数据格式

此处列举了常见的响应头,并不是全部: 每个响应头独占一行,最后1行是空行,用来区分响应头和响应体

  • 响应体

实际服务器响应给浏览器的内容

常用http状态码

HTTP状态码参考(菜鸟教程)

状态码200:成功

状态码301:资源(网页等)被永久转移到其它URL

状态码403:forbidden,拒绝访问(没有权限).

状态码404:not found 找不到页面

状态码500:服务器问题

HTTP状态码分类
分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

常见http响应设置及使用

  • location: 重定向,立即跳转(不解析响应体,直接跳转)

浏览器在解析服务器响应的时候,先判断响应行,继续响应头,最后是响应体.location是在响应头中,所以浏览器一旦遇见该协议项,不再向下解析.

header('location:test.php');//立即跳转到某网页(网址)

//跳转之后任何的语句不会被执行
echo 'test1';//无法执行,因网页已跳转
echo 'test2';//无法执行,因网页已跳转
echo 'test3';//无法执行,因网页已跳转
  • refresh:定时(秒数)重定向.(响应体会解析)

延时重定向:浏览器会根据具体时间延迟后再访问指定跳转链接.浏览器在准备跳转之前,会继续解析http协议(其他响应头和响应体)

header('refresh:10;url=test.php');//10秒后跳转到某网页(网址)

//延时跳转之后的语句10秒内会被执行
echo 'test1';//执行
echo 'test2';//执行
echo 'test3';//执行

  • content-type:内容类型,MIME类型

通过内容告知(MIME类型),浏览器正确解析内容

如上,由于服务器是utf-8,而浏览器默认编码是gbk,会造成网页乱码.现在我们设置正确的编码告知浏览器即可.(不过现在浏览器会智能检测编码基本不乱码了)

  • content-disposition: 内容类型,MIME类型扩展,激活浏览器文件下载对话框

浏览器在解析内容的时候,默认是直接解析.有时候需要浏览器不解析,当做内容下载成文件.

如上,浏览器直接下载成图片文件.

PHP模拟http请求

原理:

php可以通过模拟http协议发起http请求.

curl是一个非常强大的开源库,支持很多协议,包括http,ftp,telnet等,我们使用它来发送http请求.

它给我们带来的好处是可以通过灵活的选项设置不同的http协议参数,并且支持https.

curl可以根据url前缀是http还是https自动选择是否加密发送内容.

前提条件:http协议的客户端/服务器模式,http协议不局限于一定要浏览器访问.

 

curl扩展库使用

1.开启curl扩展

编辑php.ini,开启curl.重启服务器即可.

2.例外:有时候php版本会出现即使开启也无法使用的可能.因为curl找不到对应的dll文件,此时须将对应的dll文件(不同php版本的dll文件不一定相同)复制到windows目录.

参考:Client URL库-官网参考

参考:PHP cURL 函数-菜鸟教程

curl_init()初始化一个cURL会话。
curl_setopt()设置一个cURL传输选项。
curl_exec()执行一个cURL会话。(与服务器发起请求),得到服务器返回的内容.
curl_close()关闭一个cURL会话。(必须)

curl_init():开启连接

curl_setopt():设定curl传输选项

格式:

  • bool curl_setopt ( resource $ch , int $option , mixed $value )

参数:

  • ch 由 curl_init() 返回的 cURL 句柄。
  • option 需要设置的CURLOPT_XXX选项。
  • value 将设置在option选项上的值。

CURLOPT_URL:需要获取的URL地址,也可以在curl_init()函数中设置。

CURLOPT_RETURNTRANSFER:将curl_exec()获取的信息(服务器执行的结果即响应)以文件流的形式返回给请求界面(php脚本),而不是直接输出。

CURLOPT_POST:(默认是get请求)启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

CURLOPT_POSTFIELDS:用来传递post提交的数据:字符串或数组.字符串:(name=abc&pwd=123);数组:(array('name'==>'123'), ...)

全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1&para2=val2&...'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data

CURLOPT_HEADER:获取header信息即响应头(作为数据流输出)。默认不获取.

curl_exec():执行选项(向服务器发起请求),得到服务器返回的内容

curl_close():关闭资源

思考:刚才的php脚本运行为什么会有乱码呢?因为没有告知浏览器网页编码。现在我们设置正确的头信息,告诉浏览器是utf-8字符编码:

现在我们运行脚本看下结果:

如果要使用post(默认是get)须指定选项为post

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值