HTTP介绍

Hyper Text Transfer Protocol,超文本传输书协议,是万维网数据通信的基础,规定了请求和响应标准。

HTTP工作原理

HTTP 请求以及响应的步骤

  1. 客户端连接到Web服务器。一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接;
  2. 发送HTTP请求。通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成,其中空行的作用是告诉服务端接下来是请求体部分。
  3. 服务器接受请求并返回HTTP响应。Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
  4. 释放连接TCP连接。若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
  5. 客户端浏览器解析HTML内容。客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

在浏览器地址栏输入URL,按下回车后发生的事

  1. 浏览器向 DNS 服务器请求解析该URL中的域名所对应的 IP 地址;
  2. 解析出 IP 地址后,根据该IP地址和默认端口80,和服务器建立TCP连接;
  3. 浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
  5. 释放 TCP连接;
  6. 浏览器将该 html 文本内容显示出来。

请求方法

HTTP/1.1协议中共定义了八种方法,也可以说是动作

GET

获取指定的资源的请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中。

POST

向指定资源提交数据,请求服务器进行处理,该操作传输实体内容资源,例如提交表单或者上传文件。

HEAD

获得报文首部。与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

PUT

更新资源,向指定资源位置上传其最新内容。

DELETE

删除文件,请求服务器删除Request-URI所标识的资源。

TRACE

回显服务器收到的请求,主要用于测试或诊断。

OPTIONS

允许客户端查看服务器的性能。这个方法可使服务器传回该资源支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

注意事项

  1. 方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
  2. HTTP服务器至少应该实现GET和HEAD方法,其他方法是可选的。所有的方法的实现都应当匹配各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如PATCH(由 RFC 5789 指定的方法)用于将局部修改应用到资源

POST和GET的区别?

  • GET参数通过URL传递,POST放在Request body(请求主体)中。
  • GET在浏览器回退时是无害的,而POST需再次提交请求。  
  • GET产生的URL地址可以被Bookmark,而POST不可以。  
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。  
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。  
  • GET请求在URL中传送的参数是有长度限制的(2kb 不同浏览器也会有所不同),而POST没有。  
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。  
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET请求只能进行url编码 -- encodeURIComponent(),而POST支持多种编码方式。
  • POST数据的格式与查询字符串格式相同,如果需要将页面中表单的数据进行序列化,然后再通过 XHR 发送到服务器,可以使用 serialize()函数来创建这个字符串,也就是表单序列化

HTTP状态码

所有HTTP响应的第一行都是状态行,依次表示的是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

状态码一共分为五级:

  • 1XX ----服务器已接收请求,需进一步处理
  • 2XX----请求被服务器接收、理解并处理
    • 200: ok
    • 206:“Partial Content”响应: 客户端发送了一个带有Range请求头的Get请求,是表明自己只需要url上部分的资源,服务器完成了它。 比如:video audio播放一个很大的视频/音频地址时,一般会返回206
  • 3XX ----重定向,执行后续的操作,继续完成请求
    • 301: 永久重定向,所请求的页面已经转移至新的URL
    • 302: 临时重定向
    • 304:缓存,服务器告诉浏览器可以直接使用缓存,不用请求服务器了
  • 4XX ----请求错误 ,请求含有词法错误或者无法被执行
    • 400: 客户端语法错误
    • 401: 请求授权失败
    • 403: 请求不允许 Forbidden资源禁止被访问
    • 404: 没有发现文件、查询或URl
  • 5XX ----服务器接受请求时发生错误
    • 500:服务器不可预计的错误
    • 501: "Internal Server Error" 服务器端在执行请求时发生了错误,此时服务器并没有正常工作
    • 503: 服务器当前不能处理客户端的请求 临时过载和当机
    • 504: 服务器没连上
    • 505: 服务器不支持或拒绝支请求头中指定的HTTP版本

RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB开发过程中还是能够自定义状态描述或者自定义信息。

URL介绍

Uniform Resource Locators,统一资源定位器

组成:

  • scheme传送协议,例如http,ftp,https
  • 层级URL标记符号//固定不变
  • 访问资源需要的凭证信息(可省略)
  • 服务器,(通常为域名,有时为IP地址)
  • 端口号,(以数字方式表示,若为HTTP的默认值“:80”可省略)
  • 路径,(以“/”字符区别路径中的每一个目录名称)
  • 查询,(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
  • 片段。以“#”字符为起点,锚点

http://www.jjzz.com:80/news/index.html?id=250&page=1

传输协议:http

服务器:www.jjzz.com

端口:80

路径:/news/index.html

查询:?id=250&page=1

HTTP请求和响应格式

请求格式request


![](https://img2018.cnblogs.com/blog/1696801/201908/1696801-20190828204845680-1775463006.jpg)
【注意】get的请求包中没有请求数据部分。

响应格式response


![](https://img2018.cnblogs.com/blog/1696801/201908/1696801-20190828204911386-1190467330.png)

web框架的功能

  1. 收发消息,包含的模块有wsgi wsgiref (python模块) uwsgi(部署时使用)
  2. 根据路径返回不同的内容
  3. 返回动态的数据(字符串的替换 模板的渲染)

web的本质就是socket服务端。

web框架分类

django 可以实现2 、3功能

flask 可以实现2 功能

tornado 可以实现1、2 、3功能

手写web框架

socket服务端基础款

import socket

server = socket.socket()
server.bind(("127.0.0.1",8005))
server.listen( ) while 1:
conn,addr = server.accept()
re = conn.recv(1024)
print(re)
conn.send(b'HTTP/1.1 200 OK\r\n\r\nok')
conn.close()

根据请求的路径返回不同的内容

import socket

server = socket.socket()
server.bind(("127.0.0.1",8005))
server.listen( ) while 1:
conn,addr = server.accept()
re = conn.recv(1024)
print(re)
url = re.decode("utf-8").split()[1]
if url == "/index":
se = '这里是index'
elif url == "/home":
se = '这里是home'
else:
se = "这里是默认访问"
conn.send(b'HTTP/1.1 200 OK\r\ncontent-type: text/html; charset=utf-8\r\n\r\n')
conn.send(se.encode('utf-8')) conn.close()

函数版

import socket

server = socket.socket()
server.bind(("127.0.0.1",8005))
server.listen( ) def index(url):
ret = f'这里是{url}'
return ret.encode("utf-8")
def home(url):
ret = f'这里是{url}'
return ret.encode("utf-8") ls = [("/index",index),
("/home",home)] while 1:
conn,addr = server.accept()
re = conn.recv(1024)
print(re)
url = re.decode("utf-8").split()[1]
func = None
for i in ls:
if i[0] == url:
func = i[1]
break
if func:
se = func(url)
else:
se = "这里是默认访问".encode("utf-8") conn.send(b'HTTP/1.1 200 OK\r\ncontent-type: text/html; charset=utf-8\r\n\r\n')
conn.send(se) conn.close()

带html文件版

import socket

server = socket.socket()
server.bind(("127.0.0.1", 8005))
server.listen() def index():
with open("index.html", mode='rb') as f:
ret = f.read()
return ret def home():
with open("home.html", mode='rb') as f:
ret = f.read()
return ret ls = [("/index", index),
("/home", home)] while 1:
conn, addr = server.accept()
re = conn.recv(1024)
print(re)
url = re.decode("utf-8").split()[1]
func = None
for i in ls:
if i[0] == url:
func = i[1]
break
if func:
se = func()
else:
se = "这里是默认访问".encode("utf-8") conn.send(b'HTTP/1.1 200 OK\r\ncontent-type: text/html; charset=utf-8\r\n\r\n')
conn.send(se) conn.close()

HTTP及WEB框架简述的更多相关文章

  1. 【python】-- web框架本质

    web框架 一.web框架简述 所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def handle_request( ...

  2. Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基础文件配置,Web框架的本质,服务器程序和应用程序(wsgiref服务端模块,jinja2模板渲染模块)的使用

    Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基 ...

  3. 蜗牛历险记(二) Web框架(中)

    上篇简单介绍了框架所使用的Autofac,采用Autofac提供的Ioc管理整个Web项目中所有对象的生命周期,实现框架面向接口编程.接下来介绍框架的日志系统. 一.介绍之前 框架日志是否有存在的必要 ...

  4. python web框架Flask——csrf攻击

    CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...

  5. 【2018】Python面试题【web框架】

    1.谈谈你对http协议的认识. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使 ...

  6. python面试题四:Python web框架

    1 django.flask.tornado框架的比较? 2 什么是wsgi? WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口.具体的来说, ...

  7. Python(九)Tornado web 框架

    一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

  8. 转-基于NodeJS的14款Web框架

    基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...

  9. 初步认识Node 之Web框架

    上一篇我们认识了Node是什么之后,这一篇我们主要了解的就是它的框架了.而它的框架又分为两大类,Web框架和全栈框架,接下来我们一个一个的来了解.    Web框架 Web框架可以细分为Web应用程序 ...

随机推荐

  1. CentOS7 安装 RocketMQ 实践和小示例

    CentOS7 安装 RocketMQ 实践和小示例 1.通过 SSH 工具(比如 XShell)连接到 CentOS7 服务器上: 2.进入到 /usr/local 目录中: cd /usr/loc ...

  2. java 面试题摘要

    5.1 什么是线程 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位, 可以使用多线程对运算提速. 5.2 线程和进程有什么区别 (1)进程是资源的分配和调度的一个独 ...

  3. 洛谷P3810-陌上开花(三维偏序, CDQ, 树状数组)

    链接: https://www.luogu.org/problem/P3810#submit 题意: 一个元素三个属性, x, y, z, 给定求f(b) = {ax <= bx, ay < ...

  4. hdu 6059 Kanade's trio

    题 OwO http://acm.hdu.edu.cn/showproblem.php?pid=6059 解 由于每个数字最多是30位,枚举数字每一位考虑, 建一棵记录前缀(位的前缀,比如10拆成10 ...

  5. (转载)了解Android 4.1,之三:黄油项目 —— 运作机理及新鲜玩意

    Welcome back to GTKA, everyone's favorite investigative series where we learn all about the newest v ...

  6. node简单起服务

    1.建一个app.js文件 const http = require('http'); const chalk = require('chalk'); const conf = require('./ ...

  7. windows环境下,mysql的root密码丢失后重置方法

    运行窗口输入 services.msc,检查mysql服务是否启动,如果启动手动停止或输入 net stop mysql 停止msyql服务.   打开cmd命令行,使用cd命令进入mysql 的bi ...

  8. POJ1990--POJ 1990 MooFest(树状数组)

    Time Limit: 1000MSMemory Limit: 30000K Total Submissions: 8141Accepted: 3674 Description Every year, ...

  9. CentOS7下安装mysql5.1 或升级到5.7 以及小问题的解决方案

     正文开始 1.首先打开终端输入以下内容下载mysql5.1的repo源(安装5.7从第二步执行) wget http://repo.mysql.com/mysql-community-release ...

  10. scrapy pipeline

    pipeline的四个方法 @classmethod def from_crawler(cls, crawler): """ 初始化的时候,用以创建pipeline对象 ...