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. Cobbler——无人值守安装多种版本多种配置操作系统

    Cobbler Web 图形界面也能实现类似的导入功能,可以参见下一节举了一个Cobbler Web的用法: cobbler 添加网络同步仓库(Reposync用法)

  2. pycharm图像不能显示,之前是可以显示的。显示一两次突然不显示了

    网上说是什么包问题的就说了.我遇到一个非常奇葩的问题 因为你的设置可能是这样 每次都在窗口右侧的工具栏那边显示.可能突然心情不佳就不显示了.然后你再把勾去掉即可.你要喜欢再点上也行.

  3. 锁&lock与latch

    锁是数据库系统区别于文件系统的一个关键特性.锁机制用于管理对共享资源的并发访问.Innodb不仅仅使用行锁,也会在数据库内部其它地方使用锁,从而允许对多种不同资源提供并发访问.如:操作缓冲池中的LRU ...

  4. PHP类知识----静态属性和方法

    <?php class mycoach { public $name="陈培昌"; CONST hisage =; ; private $favorite = "喜 ...

  5. Web前端开发——概述

    前端技术构成: 结构:html,从语义的角度,描述页面结构 样式:css,从审美的角度,美化界面样式 行为:JavaScript,从交互的角度,提升用户体验 前端技术标准: 前端技术的标准就是由W3C ...

  6. C# Lambda表达式学习笔记

    本笔记摘抄自:https://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html,记录一下学习过程以备后续查用.     一.Lambda ...

  7. 燕化迷你ACDP程序FEM / BDC

    带有BMW FEM / BDC模块的Mini ACDP可通过ICP或OBP模式支持FEM / BDC IMMO键编程.与传统的接线方式相比,它们有什么区别? 方法1:通过其他设备通过焊接进行FEM / ...

  8. if语句分析

    1.if语句的反汇编判断 if语句反汇编后的标志:     执行各类影响标志位的指令             jxx xxxx 如果遇到上面的指令,则很可能是if语句:   例如:     1.案例一 ...

  9. ssh2整合: No bean named 'sessionFactory' is defined(求大神指点)

    applicationContext.xml 中已经配置 <bean id="sessionFactory" class="org.springframework. ...

  10. .net大文件上传断点续传解决方案

    HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...