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. 更改centos的网卡名

    Centos6更改网卡名的方法: 1.修改皮配置文件/etc/udev/rules.d/70-persistent-net.rules # This file was automatically ge ...

  2. 在MariaDB导入sql文件出现乱码解决方案

    第一方式: 命令: mysql -u(用户名) -p --default-character-set=utf8(设置编码) data_name(数据库名)<文件路径 示例: 这时,会有一个假死的 ...

  3. Win7 右键 新建图标消失的解决办法

    方法一: 把下面一段代码存在一个记事本上,再选择另存为1.cmd,最后运行! regsvr32 /u /s igfxpph.dll reg delete HKEY_CLASSES_ROOT\Direc ...

  4. Java-Base64工具类

    /* * Base64 encoding and decoding. * Copyright (C) 2001-2004 Stephen Ostermiller * http://ostermille ...

  5. BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)

    题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...

  6. 5天noip训练心得

    day1 100+95+0=195 T1 二分答案,并查集,很像noip2017 day2 T1 T2 缩环,然后数据结构维护求答案,貌似也是原题 T3 树形dp,比赛上没有做出来, day2 90+ ...

  7. [旧版] CASthesis 模板编译的问题

    写在前面的话:国科大最新版的模板在这里(https://github.com/mohuangrui/ucasthesis),利用它来写博后出站报告的相关介绍在这里: 本篇博文是针对另一个模板进行介绍的 ...

  8. BZOJ 3143: [Hnoi2013]游走 概率与期望+高斯消元

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M.小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获 ...

  9. VirtualBox:启动虚拟机后计算机死机

    造冰箱的大熊猫@cnblogs 2018/2/21 故障描述:Ubuntu 16.04升级Linux内核后,在VirtualBox中启动虚拟机发现Ubuntu死机,只能通过长按电源开关硬关机的方式关闭 ...

  10. AcWing:173. 矩阵距离(bfs)

    给定一个N行M列的01矩阵A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: dist(A[i][j],A[k][l])=|i−k|+|j−l|dist(A[i][j],A[k][l]) ...