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/POST方法,其他方法是可选的。所有的方法的实现都应当匹配各自的语义定义。此外,除了上述方法,特定的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

【注意】get的请求包中没有请求数据部分。

响应格式response

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()

 

WEB框架初识的更多相关文章

  1. python web框架——初识tornado

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

  2. Web框架的原理和Django初识

    一.Web框架的本质 1.本质 实际上Web应用本质上就是一个socket服务端, 而用户的浏览器就是一个socket客户端. 2.最原始的web框架 socket服务端 import socket ...

  3. Flask(1)- 主流web框架、初识flask

    一.Python 现阶段三大主流Web框架 Django.Tornado.Flask 对比 Django 主要特点是大而全,集成了很多组件(例如Models.Admin.Form等等), 不管你用得到 ...

  4. web框架--tornado框架之初识

    在python中常见的web框架构建模式有以下两种: *MVC框架: * 数据库相关操作的Models 视图文件的Views 业务逻辑的Controllers MTV框架: 数据库相关操作的Model ...

  5. web框架之初识Django

    目录 一.web框架 1.1什么是web框架 1.2自制的简易web框架 1.3三大主流web框架简介 Django Flask Tornado 1.4动态网页与静态网页 二.初识Django框架 2 ...

  6. 初识DJango——Web框架

    一.Web框架 HTTP特点 1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的类型不同. 由于HTTP协议简单 ...

  7. Web 应用 WEB框架 HTTP协议 初识Django

    ----------------------------财富存在于人的思想里,你没找到路,不等于没有路,你想知道将来要得到什么,你必须知道现在应该先做什么和先放弃什么! [web 应用] web应用 ...

  8. Go实战--也许最快的Go语言Web框架kataras/iris初识(basic认证、Markdown、YAML、Json)

    ris自称是Go语言中所有Web框架最快的,它的特点如下: 1.聚焦高性能 2.健壮的静态路由支持和通配符子域名支持. 3.视图系统支持超过5以上模板 4.支持定制事件的高可扩展性Websocket ...

  9. web框架之Django<一、初识>

    一.什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的 ...

随机推荐

  1. C语言1-2019秋第一周作业

    第一周作业 1.你对软件工程专业或者计算机科学与技术专业了解是怎样? 软件技术专业是计算机科学的一个分支,和软件科学与技术专业相比较,软件技术专业的侧重点在开发和技术的实际应用,而对软件开发的理论要求 ...

  2. .Net界面开发必备!DevExpress Blazor UI全新组件助力界面开发

    行业领先的.NET界面控件DevExpress 正式发布了v19.1版本,DevExpress UI for Blazor/ Razor组件附带7个用户界面组件(包括Data Grid和Pivot G ...

  3. 虚拟机vmware的连接方式以及IP端口,协议等概念

    1.NAT虚拟机相当于小弟,宿主机相当于大哥,宿主机虚拟出一个网段供虚拟机上网用 2.Bridge桥接,虚拟机和宿主机相当于局域网中的两台机器 3.Host-Only虚拟机只和宿主机通信,无法上网 3 ...

  4. 201871010126 王亚涛 《面向对象程序设计 (Java)》第十七周学习总结

    内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/12 ...

  5. springboot2.x下actuator模块

    一.简介    spring-boot-starter-actuator模块是一个spring提供的监控模块.我们在开运行发过程中,需要实时和定时监控服务的各项状态和可用性.Spring Boot的s ...

  6. Codeforces 871C 872E Points, Lines and Ready-made Titles

    题 OvO http://codeforces.com/contest/871/problem/C ( Codeforces Round #440 (Div. 1, based on Technocu ...

  7. 网络摘抄jdk1.8——jvm分析与调优

    一.JVM空间说明 JDK 1.7及以前,Java 类信息.常量池.静态变量都存储在 Perm(永久代)里.类的元数据和静态变量在类加载的时候分配到 Perm,当类被卸载的时候垃圾收集器从 Perm ...

  8. js中prototype和constructor的认识

    最初对js中 object.constructor 的认识: 我们都知道,在JS中有一个function的东西.一般人们叫它函数.比如下面的代码 function Person(name)    {  ...

  9. 回文数二(acm训练)

    问题 1161: [回文数(二)] 时间限制: 1Sec 内存限制: 128MB 提交: 133 解决: 51 题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数.  ...

  10. 教程:myeclipse在线安装svn插件

    SVN 版本控制,相信开发过程中都很多有用到,今天在myeclipse 在线安装了SVN插件.下面是具体步骤,记录下,希望对有需要的朋友提供帮助. 要求: Myeclispe,电脑能连接互联网 步骤: ...