28天PHP零基础入门到精通教程(P3 核心编程技术)-day03 P33-P38 HTTP


F:\HTML_前端\PHP\B站黑马BV18x411H7qD\资料-零基础新手入门PHP教程-改\资料-零基础新手入门PHP教程\03-PHP核心技术\day3资料\核心编程-day03-资料包\笔记\核心编程-day03.docx

P33 01HTTP协议一-基本了解

HTTP协议

HTTP协议初步认识

HTTP协议概念

HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

HTTP协议特点

1) 客户/服务器模式:客户端(浏览器)/服务端

2) 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

3) 灵活:HTTP允许传输任意类型的数据对象(MIME类型)

4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

5)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP协议分类

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

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

 

P34 02HTTP协议一HTTP请求

HTTP请求

请求行

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

2) GET /index.php HTTP/1.1

 资源路径就是主机地址后面跟的那个文件路径  eg:/index.php ‘/’表示根目录,所以现在要请求的是根目录下的index.php文件

最早的时候HTTP协议有过1.0,请求行独占一行(第一行)

请求头

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

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

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

3)Accept-Language:接收的语言

4)User-Agent:客户浏览器所在电脑的一些信息(通常包括浏览器的版本、内核等等)

 

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

请求体

请求数据:(只有)POST请求会有请求体。GET请求所有的数据都是跟在URL之后,会在请求行中的资源路径上体现。(理解)

基本格式:资源名字=资源值&资源名字=资源值…(类似表单)

 下面一个红色框中的内容都是请求头  User-Agent里面的内容是一些系统内核 操作系统 浏览器版本型号等

P35 03HTTP协议一HTTP响应

HTTP响应

响应行

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

HTTP/1.1 200 ok

2)200 ok: 成功

3)403 Forbidden: 没权限访问

4)404 Not Found: 未找到页面

5)500 Server Internal Error: 服务器内部错误

响应头

具体协议内容

1)时间:Wed, 16 Sep 2017 11:43:33 GMT

2)服务器:Server: Apache/2.2.22 (Win32) PHP/5.3.13

3)内容长度:Content-Length: 1571,数据具体的字节数(响应体)

4)内容类型:Content-Type: text/html:告诉浏览器对应的数据格式

 

列举了几个常见的响应头,并不是全部:响应头一个占一行,最后一行空行(区分响应头和响应体)

响应体

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

 第三行Server: Apache/2.2.22 (Win32) PHP/5.4.8是服务器的信息

Last-Modified会很有用 比如说浏览器已经访问过这个文件了 如要要再次访问就会告诉服务器 我这个文件上次是什么时候修改的 比如说是昨天修改的 而浏览器用的是今天上午刚刚请求的 就可以只访问本地 从而节省本地的一个带宽 这种技术叫做缓存技术 浏览器的本地缓存

HTTP响应

常见HTTP响应设置及使用

PHP中针对HTTP协议(响应)进行了底层设计,可以通过函数header来实现修改HTTP响应(响应头)

注意事项:(理解)

1、 Header可以设计HTTP响应,因为HTTP协议特点是:响应行,响应头(空行结尾),响应体。认为通过header设计响应头的时候,不应该有任何内容输出,所以一旦产生内容输出(哪怕一个空格),系统都会认为响应头已经结束而响应体开始了,所有如果先输出内容后设置响应头(header使用),理论设置无效;

所以应该先写header 再写内容(例如echo)等语句

2、 在PHP5以后,增加程序缓存内容:允许服务器脚本在输出内容的时候,不直接返回浏览器而是现在服务器端使用程序缓存保留(php.ini中使用output_buffering),有了该内容之后,在程序缓存内会自动调整响应头和响应体(允许响应头在已经输出的内容之后再设置),但是此时会报错(警告)。

总结:header设置响应体之前不要有任何输出

Location:重定向,立即跳转(响应体不用解析)

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

Refresh:重定向,定时跳转(响应体会解析)

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

 

 会输出‘hello world’ 但3秒之后又会跳转到了20select.php

这个很常用:例如支付界面

Content-type:内容类型,MIME类型

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

 通过header中的Content-type告诉浏览器这是什么内容(还可以是图片等)后面的是编码方式

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

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

 attachment是附件的意思

这里不需要激活 就直接下载了 有时候需要直接下载PHP文件的时候就可以用到

可以控制用户下载的一个内容 直接放到本地去看

PHP模拟HTTP请求

原理

PHP可以通过模拟HTTP协议发起HTTP请求

CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。

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

Curl扩展库使用(PHP自带这个Curl扩展)

1、 开启CURL扩展

2、 有的时候PHP版本会出现即使开启了扩展也无法使用扩展的可能:因为CURL找不到对应的dll文件:需要将相关的DLL文件放到C:windows

3、 重启Apache应用

1)建立连接:curl_init():激活一个CURL连接功能

 

2)设置请求选项:curl_setOpt():设定选项

CURLOPT_URL:连接对象

CURLOPT_RETURNTRANSFER:将服务器执行的结果(响应)以文件流的形式返回给请求界面(PHP脚本)

CURLOPT_POST:是否才有POST方式发起请求(默认请求是GET)

CURLOPT_POSTFIELDS:用来传递POST提交的数据,分为两种方式:字符串(name=abc&password=123)以及数组形式(array(‘name’=>’abc’,…))

CURLOPT_HEADER:是否得到响应的header信息(响应头),默认不获取

 

 这样设置是OK的 只是响应头我不要

3)执行请求:curl_exec():执行选项(与服务器发起请求),得到服务器返回的内容(是给PHP)

 

乱码原因:20select.php中的内容有告知浏览器,但是当前是被服务器脚本23curl_http.php访问的,没有做解析;输出给浏览器之后,需要当前23curl_http.php告知浏览器对应的字符集

4)关闭连接:curl_close():关闭资源

 PS:

 为什么输出内容$content会乱码?因为只是将这些内容拿过来,并不是把它当做响应头(查看网页源代码会发现只是他的一个内容)

我们普通访问的话是不会看见它对应的一个访问头的 所以当你能看到这些信息的时候说明他不是一个真正的响应头 而是把响应头拿出来当做字符串了

 所以当前页面脚本没有告诉浏览器应该使用什么样的字符集

相关