课程目录
第1章 【GoWeb开发实战】Web 介绍
第2章 【GoWeb开发实战】Go搭建Web服务器以及http包详解
第3章 【GoWeb开发实战】Http的客户端实现
第4章 【GoWeb开发实战】Go与表单
第5章 【GoWeb开发实战】Go访问数据库
第6章 【GoWeb开发实战】Go操作MySQL数据库
第7章 【GoWeb开发实战】Go操作Redis
第8章 【GoWeb开发实战】避免SQL注入
第9章 【GoWeb开发实战】Cookie
第10章 【GoWeb开发实战】Session
第11章 【GoWeb开发实战】XML处理
第12章 【GoWeb开发实战】JSON处理
第13章 【GoWeb开发实战】正则表达式
第14章 【GoWeb开发实战】模板处理-template
第15章 【GoWeb开发实战】文件操作
第16章 【GoWeb开发实战】RPC
第17章 【GoWeb开发实战】Beego之Controller
17.1 【GoWeb开发实战】Beego的参数配置和路由控制
17.2 【GoWeb开发实战】Beego之Controller使用
17.3 【GoWeb开发实战】Beego处理http请求数据
17.4 【GoWeb开发实战】Beego之Cookie
17.5 【GoWeb开发实战】Beego之Session
第18章 【GoWeb开发实战】Beego框架简介和安装
第19章 【GoWeb开发实战】Beego之Model
19.1 【GoWeb开发实战】Beego之ORM模型Model介绍
19.2 【GoWeb开发实战】Beego之ORM的CRUD操作
19.3 【GoWeb开发实战】Beego之ORM高级查询
19.4 【GoWeb开发实战】Beego之原生SQL查询
19.5 【GoWeb开发实战】Beego之构造查询
19.6 【GoWeb开发实战】Beego之事务处理
19.7 【GoWeb开发实战】Beego之模型定义
第20章 【GoWeb开发实战】Beego之View
20.1 【GoWeb开发实战】Beego之模板语法
20.2 【GoWeb开发实战】Beego之模板处理
20.3 【GoWeb开发实战】Beego之模板函数
20.4 【GoWeb开发实战】Beego之文件
第21章 【GoWeb开发实战Beego框架实现】博客项目实战-项目介绍
第22章 【GoWeb开发实战】博客项目搭建以及注册用户信息功能实现
第23章 【GoWeb开发实战Beego框架实现】博客项目实战-登录功能实现
第24章 【GoWeb开发实战Beego框架实现】博客项目实战-Session处理
第25章 【GoWeb开发实战Beego框架实现】博客项目实战-写文章功能
第26章 【GoWeb开发实战Beego框架实现】博客项目实战-首页设计
第27章 【GoWeb开发实战Beego框架实现】博客项目实战-显示文章详情
第28章 【GoWeb开发实战Beego框架实现】博客项目实战-修改文章功能
第29章 【GoWeb开发实战Beego框架实现】博客项目实战-删除文章功能
第30章 【GoWeb开发实战Beego框架实现】博客项目实战-标签功能
第31章 【GoWeb开发实战Beego框架实现】博客项目实战-首页功能扩展
第32章 【GoWeb开发实战Beego框架实现】博客项目实战-文件上传和图片展示功能
第33章 【GoWeb开发实战Beego框架实现】博客项目实战-关于我
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容。在这个看似简单的用户行为背后,到底隐藏了些什么呢? 对于普通的上网过程,系统其实是这样做的:浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览器发送完HTTP Request (请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回HTTP Response (响应)包;客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body) ,等收到全部的内容随后断开与该服务器之间的TCP连接。
一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(其实手机端客户端内部也是浏览器实现的)。 Web服务器的工作原理可以简单地归纳为:
客户端通过TCP/IP协议建立到服务器的TCP连接
客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档
服务器向客户端发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言 的解释引擎负责处理“ 动态内容”,并将处理得到的数据返回给客户端
客户端与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果
一个简单的HTTP事务就是这样实现的,看起来很复杂,原理其实是挺简单的。需要注意的是客户端与服务器之间的通信是非持久连接的,也就是当服务器发送了应答后就与客户端断开连接,等待下一次请求。
第一次请求url,服务器返回的是html页面,然后浏览器开始渲染HTML。当解析到HTML DOM里面的图片连接,css脚本和js脚本的连接,浏览器会自动发起一个请求静态资源的HTTP请求,获取相应静态资源,然后浏览器会渲染出来,最终将所有资源整合、渲染、完整展现在屏幕上。(网页优化有一向措施是减少HTTP请求次数,把尽量多的css和js资源合并在一起)。
我们浏览网页都是通过URL访问的,那么URL到底是怎么样的呢?
URL (Uni form Resource Locator)是 “统一资源定位符” 的英文缩写,用于描述一个网络 上的资源,基本格式如下
scheme://host[:port#]/path/.../[?query-string][#anchor]
scheme
指定低层使用的协议(例如: http, https, ftp)
host
HTTP服务器的I P地址或者域名
port#
HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例
path
访问资源的路径
query-string
发送给http服务器的数据
anchor
锚
举个例子:
让我们来解析一下下面这一段:
http://mail.163.com/index.html
1、http://:这个是协议,也就是HTTP超文本传输协议,也就是网页在网上传输的协议。
2、mail:这个是服务器名,代表着是一个邮箱服务器,所以是mail.
3、163.com:这个是域名,是用来定位网站的独一无二的名字。
4、mail.163.com:这个是网站名,由服务器名+域名组成。
5、/:这个是根目录,也就是说,通过网站名找到服务器,然后在服务器存放网页的根目录
6、index.html:这个是根目录下的默认网页(当然,163的默认网页是不是这个我不知道,只是大部分的默认网页,都是index.html)
7、http://mail.163.com/index.html:这个叫做URL,统一资源定位符,全球性地址,用于定位网上的资源。
URI:uniform resource identifier,
统一资源标识符,用来唯一的标识一个资源。
URL:uniform resource locator,
统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
URN:uniform resource name,
统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。
也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。
DNS (Domain Name System)是 “城名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它从事将主机名或域名转换为实际IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。
DNS解析过程
通过上面的步骤,我们最后获取的是IP地址,也就是浏览器最后发起请求的时候是基于IP来和服务器做信息交互的。
举个例子来说,你想知道某个一起上法律课的女孩的电话,并且你偷偷拍了她的照片,回到寝室告诉一个很仗义的哥们儿,这个哥们儿二话没说,拍着胸脯告诉你,甭急,我替你查(此处完成了-次递归查询,即,问询者的角色更替)。然后他拿着照片问了学院大四学长,学长告诉他,这姑娘是xx系的;然后这哥们儿马不停蹄又问了xx系的办公室主任助理同学,助理同学说是xx系yy班的,然后很仗义的哥们儿去xx系yy班的班长那里取到了该女孩儿电话。(此处完成若千次迭代查询,即,问询者角色不变,但反复更替问询对象)最后,他把号码交到了你手里。完成整个查询过程。
HTTP协议是Web工作的核心,所以要了解清楚Web的工作方式就需要详细的了解清楚HTTP是怎么样工作的。
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写是一个基于TCP/IP通信协议来传递数据,服务器传输超文本到本地浏览器的传送协议,建立在TCP协议之上,一般采用80端口。HTTP协议工作于客户端-服务端架构上。浏览器可作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。它是一个无状态的请求/响应协议。
客户端请求消息和服务器响应消息都会包含请求头和请求体。HTTP请求头提供了关于请求或响应,发送实体的信息,如:Content-Type、Content-Length、Date等。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP是一种让web服务器与客户端通过Internet发送与接受数据的协议,它是一个请求、响应协议,客户端建立连接并发送请求。服务器不能主动去与客户端联系,也不能发送一个回调连接,客户端可提前中断连接。
HTTP请求是无状态的,同一个客户端的每个请求之间没有关联,对HTTP服务器来说,它并不知道这两个请求是否来自同一个客户端。为了解决这个问题引入了cookie机制来维护链接的可持续状态。
我们先来看看Request包的结构:
由 请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本
GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。
第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息
从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等
第三部分:空行,请求头部后面的空行是必须的
即使第四部分的请求数据为空,也必须有空行。
第四部分:请求数据也叫主体,可以添加任意的其他数据
请求包的例子:
GET http://edu.kongyixueyuan.com/ HTTP/1.1 //请求行: 请求方法请求URI HTTP协议/ 协议版本
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */* //客户端能接收的数据格式
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
UA-CPU: AMD64
Accept-Encoding: gzip, deflate //是否支持流压缩
Host: edu.kongyixueyuan.com //服务端的主机名
Connection: Keep-Alive
//空行,用于分割请求头和消息体
//消息体,请求资源参数,例如POST传递的参数
我们通过fiddler抓包可以看到如下请求信息:
我们再来看看HTTP的response包,也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息
第二行和第三行为消息报头, Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。
响应包的例子:
HTTP/1.1 200 OK //状态行
Server: nginx //服务器使用的WEB软件名及版本
Content-Type: text/html; charset=UTF-8 //服务器发送信息的类型
Connection: keep-alive //保持连接状态
Set-Cookie: PHPSESSID=mjup58ggbefu7ni9jea7908kub; path=/; HttpOnly
Cache-Control: no-cache
Date: Wed, 14 Nov 2018 08:27:32 GMT //发送时间
Content-Length: 99324 //主体内容长度
//空行用来分割消息头和主体
<!DOCTYPE html>... //消息体
我们通过fiddler抓包可以看到如下响应信息:
状态码用来告诉HTTP客户端, HTTP服务器是否产生了预期的Response。HTTP/1. 1协议中定义了5类状态码,状态码由三位数字组成,第一个数字定义了响应的类别。(HTTP状态码的英文为HTTP Status Code)
常见状态码:
200 OK //客户端请求成功 400 Bad Request //客户端请求有语法错误,不能被服务器所理解 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden //服务器收到请求,但是拒绝提供服务 404 Not Found //请求资源不存在,eg:输入了错误的URL 500 Internal Server Error //服务器发生不可预期的错误 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
HTTP协议是无状态的和Connection: keep alive的区别 无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。 HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(面对无连接)。 从HTTP/1.1起,默认都开启了Keep-Alive保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的TCP连接。 Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同服务器软件(如Apache) 中设置这个时间。
根据HTTP标准,HTTP请求可以使用多种请求方法。 HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。 HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
常用方法: Get\Post\Head
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE,对应着对这个资源的查 ,改 ,增 ,删 4个操作。
另外还有个Head方法. 类似GET方法,只请求页面的首部,不响应页面Body部分,用于获取资源的基本信息,即检查链接的可访问性及资源是否修改。
GET和POST的区别:
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据))
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道
HTTPS是HTTP over SSL/TLS,HTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一个安全套接层SSL。
服务器 用RSA生成公钥和私钥把公钥放在证书里发送给客户端,私钥自己保存客户端首先向一个权威的服务器检查证书的合法性,如果证书合法,客户端产生一段随机数,这个随机数就作为通信的密钥,我们称之为对称密钥,用公钥加密这段随机数,然后发送到服务器服务器用密钥解密获取对称密钥,然后,双方就已对称密钥进行加密解密通信了。
Https的作用
Https和Http的区别
全思维工程师介绍 关注
评论