网络基本概念

客户端和服务端

1.不管是客户端,还是服务器,它们都是一个应用程序,而不是一台计算机。

客户端和服务器可以分布在不同的计算机上,也可以在同一台计算机上,并不需要特殊看待。
比如我们之前接触的live server插件,就是一个服务器,它运行在本地的计算机上。
大部分后端开发的就是服务器程序,前端的Node技术也能开发服务器程序。

2.客户端和服务器的这种交互模式称之为「经典C/S结构」。在这种结构中,如果客户端是浏览器,则我们称
之为B/S结构。

3,服务器程序往往是为互联网产品提供服务,因此又称之为web服务器。

4.一次完整的交互,总是从请求开始,响应结束。

URL

要完成一次请求和响应,首先需要让客户端找到服务器,不仅如此,还要找到服务器上我们想要的资源。
在现实生活中,如果我们要找一个人,我们可以通过一个地址来找到他。

和现实生活类似,在互联网中,我们可以通过一个叫URL地址的东西找到我们想要的资源。

URL全称uniform resource locator,统一资源定位符。

它是一个字符串,用于表达互联网中某个资源的位置。

URL地址可以很长,也可以很短。

通过URL地址可以找到互联网上的资源,它可以是页面、图片、视频、音频、css代码、js代码、可供下载的
文件、或者其他任何东西。
一个完整的URL地址由多个部分组成

URL一般由以下部分组成:

  1. 协议(如http、https):表示URL使用的协议。
  2. 主机(IP地址和域名)(如www.example.com):表示服务器的域名。
  3. 端口(如80):表示服务器的端口号。
  4. 路径(如/index.html):表示请求的路径。
  5. 查询参数(如?param1=value1&param2=value2):表示请求的查询参数,用于传递附加信息。
  6. hash
1
2
3
4
完整的URL地址
协议+主机+端口+路径+参数+hash
例如:一个完整的URL可能如下:
https://www.example.com:80/index.html?param1=value1&param2=value2
1
2
小知识:
1.URL里不能出现非ASCII字符

协议

协议Protocal/Schema
它表示客户端希望用什么方式和服务器沟通,经常固定写http或https即可

1
2
3
4
小知识:
1.如果在浏览器的地址栏省略了协议,浏览器会自动为你补全
2.可以在Chrome浏览器的地址栏点击右键,显示完整的地址
3.https协议比http协议更安全,但往往出现在线上,本地的服务器通常不会是https

主机

1.IP地址。

IP地址是一个网络中计算机的唯一编号,通常,一个IP对应一台计算机。
记住特殊IP地址:127.0.0.1,它表示本机IP

2.域名。域名类似IP地址的别名,把不容易记忆的数字变为容易记忆的单词。当使用域名访问时,会自动转
换为IP地址。

记住特殊域名:localhost,它表示的IP地址是127.0.0.1

端口

端口Port

它表示客户端希望在哪个应用程序中寻找资源
每个服务器程序,都会监听一个或多个端口,只有找到对应的端口,才能找到这个服务器程序。
端口号是可选的,若不填写,则:
1.如果使用的是http协议,默认端口号为80
2.如果使用的是https协议,默认端口号为443

路径

路径Path
服务器上往往有许许多多的资源,每个资源都有自己的访问路径
路径是可选的,若不填写,则路径为/

参数

参数Query/Param
某些资源可以根据需要呈现不同的内容,比如一篇新闻列表的页面,可以指定它呈现第几页的新闻,而「第几
页」就属于一些额外信息,这些额外信息可以通过参数传递
比如,我们访问一个新闻列表的页面,同时希望它展示第5页,每页展示10条新闻,我们可能得到下面的URL地
址:

http://duyiedu.com/news?page=1&limit=10
上面这个URL地址中,page=1&limit:=10就是参数部分,这部分可以包含多个参数,不同的参数之间使
用&符号分割

参数是可选的

hash

在网络通信中,hash没有什么用,它往往作为浏览器的锚链接出现

PostMan使用

环境变量的设置

HTTP

通过URL地址,能够在茫茫互联网中准确的找到自己想要的服务。
但光找到服务还是不够,双方需要「用同一种语言」来对话,否则都听不懂对方在说什么。这个「语言」就是协议,而互联网中最常见的协议就是http协议
https是在http协议基础上发展起来的,它增加了安全性,其他和http协议完全一致
http是基于请求-响应的方式完成通信的,每一次通信都是由客户端向服务器发出请求,传递一些消息过去,然后经过服务器程序处理后,响应给客户端一些消息。
http协议规定:
1.每次请求-响应都是独立的,相互之间互不干扰。这种模式的协议我们称之为无状态协议,断开式连接http的无状态会带来一些问题,后续再讨论
2.每次请求-响应传递的消息都是纯文本(字符串),而且文本格式必须按照http协议规定的格式书写。

请求的消息格式

  • 请求行:高度概括了客户端想要干什么
  • 请求头:描述了请求的一些额外信息
  • 请求体:包含了要给服务器传递的正文数据。请求体是可以省略的

请求行

请求行是整个http报文的第一行字符串,它包含三个部分:请求方法 路径+参数+hash 协议和版本

重点关注请求方法

请求方法是一个单词,它表达了客户端的「动作」,比如:

  • GET:获取
  • POST:提交

在http协议中,并没有规定只能使用上面两种动作,甚至没有规定每种动作会带来怎样的变化

  • 1.动作通常有:GET(获取资源)、POST(提交消息)、PUT(修改数据)、DELETE(删除数据)。其中,GET和POST最为常见。
  • 2.GET和DELETE请求不能有请求体,而POST和PUT请求可以有请求体

浏览器遵循了上面的规范
这带来了GET和POST的诸多区别。比如,由于GET请求没有请求体,所以要传递数据只能把数据放到URL的参数中

在浏览器中,获取数据一般使用的都是GET请求,比如:

  • 在地址栏输入地址并按下回车
  • 点击了某个a元素
  • 获取图片、音频、视频
  • 获取css、js、字体等文件

事实上,浏览器自动发出的请求基本都是GET请求,而P0ST请求需要开发者手动处理,比如在form表单中设
置method为P0ST

下面是一个例子:

1
2
3
4
5
6
7
8
9
<body>
<form action="http://www.baidu.com" method="post">
账号:
<input type="text"/
<p>
<button>提交</button>
</p>
</form>
</body>

请求头

全是键值对

请求头是一系列的键值对,里面包含了诸多和业务无关的信息
浏览器每次请求服务器都会自动附带很多的请求头,其实这些请求头大部分服务器是不需要的

我们只需关注下面几个请求头即可:

  • 1.Host:ur1地址中的主机
  • 2.User-Agent:客户端的信息描述
  • 3.Content-Type:

表示请求体的消息是什么格式,如果没有请嫌体,这个字段无意义
该字段的常见取值为:

  1. application/x-www-form-urlencoded
    表示请求体的数据格式和url地址中参数的格式一样,比如
1
loginId=admin&loginPwd=123123

2.application/json
表示请求体的数据是json格式,比如

1
{"loginId":"admin","loginPwd":"123123"}
  1. multipart/form-data
    一种特殊的请求体格式,上传文件一般选择该格式

请求体

包含业务数据的字符串
理论上,请求体可以是任意格式的字符串,但习惯上,服务器普遍能识别以下格式:
application/x-www-form-urlencode 属性名=属性值&属性名=属性值.
application/json (”属性名”:”属性值”,”属性名”:”属性值)
multipart/form-data: 使用某个随机字符串作为属性之间的分隔符,通常用于文件上传

由于请求体格式的多样性,服务器在分析请求体时可能无法知晓具体的格式,从而不知道如何解析请求体,因
此,服务器往往要求在请求头中附带一个属性Content-Type来描述请求体使用的格式

响应的消息格式

  • 响应行

  • 响应头

  • 响应体

响应行

响应行是整个响应字符串的第一行

响应行包含两个部分:

协议版本:表示服务器打算和客户端用什么协议通信

状态码、状态消息:表示服务器对当前请求的表态

状态码
分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接受并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

通常认为,0~399之间的状态码都是正常的,其他是不正常的

常见的状态码
  • 200 OK: 一切正常
  • 301 Moved Permanently:资源已被永久重定向,浏览器会发送两个请求,请求新的地址,新的地址被放到响应头的Location中
  • 302 Found:资源已被临时重定向,临时被移动到了一个新的地址,请求新的地址,新的地址被放到响应头的Location中
  • 304 Not Modified: 文档内容未修改,你的请求我收到了,你要的东西跟之前是一样的,没有任何的变化,所以我就不给你结果了,你自己就用以前的吧。啥?你没有缓存以前的内容,关我啥事
  • 400 Bad Request: 语义有误,当前请求无法被服务器理解。你给我发的是个啥啊,我听都听不懂
  • 403 Forbidden:服务器拒绝执行。你的请求我已收到,但是我就是不给你东西
  • 404 Not Found:资源不存在。你的请求我收到了,但我没有你要的东西
  • 500 Internal Server Error:服务器内部错误。你的请求我已收到,但这道题我不会,解不出来,先睡了

响应头

响应头header

和请求头一样,响应头也是由很多个键值对组成的,具体有哪些键值对,完全取决于服务器程序
目前,对我们最重要的键值对是Content-Type,它有多种取值,表示响应体的数据类型。
在B/S模式中,浏览器会自动根据响应头中Content-Type的取值,决定如何处理响应体。

  • 1.text/plain: 普通的纯文本,浏览器通常会将响应体原封不动的显示到页面上
  • 2.text/html: html文档,浏览器通常会将响应体作为页面进行渲染
  • 3.text/javascriptapplication/javascript: js代码,浏览器通常会使用JS执行引擎将它解析执行
  • 4.text/css: css代码,浏览器会将它视为样式
  • 5.image/jpeg: 浏览器会将它视为jpg图片
  • 6.attachment: 附件,浏览器看到这个类型,通常会触发下载功能
  • 7.其他MIME类型

响应体

浏览器就是用户代理,也就是User-agent,帮助用户完成一些用户繁琐的操作,比如发送一个页面的请求,还会找到该页面所链接到的资源,然后发送对这些资源的请求