本文是网络系列的第一篇文章,作者是通信工程出身,以前接触的计算机通信网方面的知识多是tcp/ip、OSI七层模型、信道这些比较偏底层的知识,在入了前端的坑之后,开始深入学习应用层使用最多的http,这篇文章除了简单介绍http的基本知识,还通过几个具体的例子来进一步相应的知识。
Http简介
先来Copy一段介绍。
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
client and server.jpg简单总结,http是一种用来传输数据的协议,它规定了通信的双方在进行通信时各自的行为,双方只要按照规定好的流程走,就可以进行一次成功的通信,接受/传输相应的数据。在这里通信的双方我们称之为客户端和服务端(client and server),在互联网中,服务端一般是指服务器上给我们提供服务的软件,客户端一般是指运行在我们个人PC或手机等设备上的软件,典型的比如说浏览器,桌面应用,移动端app等,凡是需要向服务端请求数据的我们都可以称其为客户端。
那么如何通过http来传输数据呢?http协议规定的通信双方的行为又是如何的呢?
实操http
为了更直观的了解使用http进行网络请求的过程,在这里我们先使用curl命令来进行http请求,curl命令我在上一篇博客常用命令行及相关命令行工具资源介绍中有提到,但是没有深入介绍,在这里顺便展示一下这个命令的使用。
以请求百度首页为例
curl "www.baidu.com" //直接通过curl命令后加URL地址,可以直接对百度对服务器发http请求,得到如下响应。
响应.png
显然,向www.baidu.com发送http请求,百度会直接返回我们一个网页,如果将上方的发送接受动作放在浏览器中进行,即直接在浏览器地址栏中输入www.baidu.com,可以看到百度的服务器返回给我们的网页。
再看一次请求www.baidu.com
curl -v "www.baidu.com" // -v会显示详细的请求信息
//下面是新增的请求和响应信息
* Rebuilt URL to: www.baidu.com/
* Trying 61.135.169.125...
* TCP_NODELAY set
* Connected to www.baidu.com (61.135.169.125) port 80 (#0)
> GET / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: Keep-Alive
< Content-Length: 2381
< Content-Type: text/html
< Date: Mon, 06 May 2019 03:02:44 GMT
< Etag: "588604c4-94d"
< Last-Modified: Mon, 23 Jan 2017 13:27:32 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
在详细信息中,空行上方的是请求的信息,下方的是返回的响应的信息。
我们在一开始提到了,http通信的双方遵循响应的规则就能实现通信,在这里我们不去讨论底层的tcp是如何实现通信的,只讨论http的规则是怎样的。
简单的来讲,就是客户端发出一个http请求,服务端收到后回复一个响应,首先来看一下http请求的格式
请求行
请求头
空行
请求体
//对应
> GET / HTTP/1.1 //请求行--GET代表请求的方法,HTTP代表请求遵循的协议,1.1代表HTTP版本
> Host: www.baidu.com //请求头--可以自己规定信息,以key: value形式表示。
> User-Agent: curl/7.54.0
> Accept: */*
//空行
//请求体(该请求没有请求体)
在发送http请求时,最关键可能是URL地址和http方法了,http方法最常用的分为两种,GET和POST,GET用来请求数据,参数可以写在RUL地址里。POST用来提交数据并接受响应,数据写在请求体里面。
名称 | 用途 |
---|---|
GET | GET请求会显示请求指定的资源。一般来说GET方法应该只用于数据的读取,而不应当用于会产生副作用的非幂等的操作中。GET会方法请求指定的页面信息,并返回响应主体,GET被认为是不安全的方法,因为GET方法会被网络蜘蛛等任意的访问。 |
POST | POST请求会 向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。POST方法是非幂等的方法,因为这个请求可能会创建新的资源或/和修改现有资源。 |
HEAD | HEAD方法与GET方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应HEAD请求时不会回传资源的内容部分,即:响应主体。这样,我们可以不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。 |
PUT | PUT请求会身向指定资源位置上传其最新内容,PUT方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。 |
DELETE | DELETE请求用于请求服务器删除所请求URI(统一资源标识符,Uniform Resource Identifier)所标识的资源。DELETE请求后指定资源会被删除,DELETE方法也是幂等的。 |
CONNECT | CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信 |
OPTIONS | OPTIONS请求与HEAD类似,一般也是用于客户端查看服务器的性能。 这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用'*'来代替资源名称,向服务器发送OPTIONS请求,可以测试服务器功能是否正常。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。 |
TRACE | TRACE请求服务器回显其收到的请求信息,该方法主要用于HTTP请求的测试或诊断。 |
PATCH | PATCH方法出现的较晚,它在2010年的RFC 5789标准中被定义。PATCH请求与PUT请求类似,同样用于资源的更新。二者有以下两点不同:1.PATCH一般用于资源的部分更新,而PUT一般用于资源的整体更新。2.当资源不存在时,PATCH会创建一个新的资源,而PUT只会对已在资源进行更新。 |
curl -X POST -- "https://www.baidu.com" //该指令-X规定了请求的方法是POST
curl -X POST -d "12334" -- "https://www.baidu.com" // -d 后面表示要传输的数据,该数据会放在请求体里面
通过curl指令我们可以看到http通信双方的请求和响应的信息,我们还可以通过Chrome浏览器来查看这些信息。
打开Chrome浏览器,按F12打开调试模式
chrome浏览器查看http.png
打开调试模式后,在地址栏中输入网址然后回车,就会在Network选项卡下看到所有的http请求和响应,点击具体的请求可以看到详细信息。
http响应报文和请求报文基本一致,只在第一行有区别,响应报文不显示http方法,而是显示http状态码。状态码的含义如下:
状态码 | 含义 |
---|---|
1xx | 这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。这些状态码代表的响应都是信息性的,标示客户应该采取的其他行动。 |
2xx | 这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。 |
3xx | 这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明 |
4xx | 这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。 |
5xx | 表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。这些状态码适用于任何响应方法。 |
总结
本文只是浅显的介绍了http的基本使用和基本概念。其他例如http协议无连接 、无状态的特点,URI和URL的区别,三次握手等http相关的知识还没有提到,我可能会在以后的文章中继续分享网络相关的知识,感兴趣的朋友可以去读一下《图解http协议》这本书,作者本人读过这本书,对于http的讲解非常透彻,也比较有趣,更专业的话可以去读一下《TCP/IP详解》,一共有三卷,这个就比较枯燥了,但是是最经典的网络协议相关的书籍。
网友评论