精华内容
下载资源
问答
  • http

    千次阅读 2021-01-01 08:20:11
    Http协议介绍 什么是HTTP协议 HTTP协议,全称HyperTextTransferProtocol,中文名为超文本传输协议是互联网中最常用的一种网络协议。HTTP的重要应用之一是WWW服务。设计HTTP协议最初的目的就是提供一种发布和接收HTML...

    Http协议介绍

    什么是HTTP协议

    HTTP协议,全称HyperText Transfer Protocol,中文名为超文本传输协议
    是互联网中最常用的一种网络协议。HTTP的重要应用之一是 WWW服务。
    设计 HTTP协议最初的目的就是提供一种发布和接收HTML (一种页面标记语言)页面的方法。
    HTTP协议是互联网上常用的通信协议之一。它有很多的应用,但最流行的就是用于Web浏览器和Web服务器之间的通信,即WWW应用或称Web应用。
    www ,全称World Wide Web ,常称为Web ,中文译为"万维网
    www是目前互联网上最受用户欢迎的信息服务形式。HTTP协议的 WWW服务应用的默认端口为80,另外一个加密的WWW服务应用https的默认端口为443,主要用于网银、支付等和钱相关的业务。当今,HTTP服务、WWW服务、Web服务三者的概念已经混淆了,都是指当下最常见的网站服务应用。

    HTTP协议版本

    HTTP/1.0 规定浏览器和服务器只保持短暂的连接(TCP短链接)
    HTTP/1.1 支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和时间延迟(TCP长连接)

    什么是超文本

    包含有超链接(Link)和各种多媒体元素标记的文本。这些超文本文件彼此链接,形成网状(Web),因此又被称为网页(Web Page)。这些链接使用URL表示。
    最常见的超文本格式是超文本标记语言HTML。

    什么是URL


    超文本传输协议HTTP

    什么是超文本传输协议HTTP
    超文本传输协议HTTP是一种按照URL指示,将超文本文档从一台主机(Web服务器)传输到另一台主机(浏览器)的应用层协议,以实现超链接的功能。

    HTTP协议总结

    http是一个超文本传输协议
    http建立在应用层协议基础之上
    http默认端口80, https默认端口443
    一次tcp的链接,可以包含多次http的请求

    Http工作原理


    网站访问流程

    1.本地redirect跳转
    2.检查本地浏览器缓存
    3.DNS流程
    递归 客户端向服务端发起DNS查询
    迭代 服务端与服务端发起DNS查询
    1.查询本地Hosts
    2.请求本地localDNS
    3.返回对应的IP
    4.HTTP连接
    1.建立TCP三次握手,发送请求内容, 请求头、请求的行、请求的主体
    2.将请求传递给负载均衡, 负载均衡做对应的调度
    3.如果请求的是静态页面, 那么调度至对应的静态集群组即可
    4.如果请求的是动态页面, 将请求调度至动态集群组
    1.如果仅仅是请求页面, 可能会经过Opcache缓存返回
    2.如果请求页面需要查询数据库, 或者是往数据库插入内容
    3.检查对应的操作是查询还是写入, 如果是查询数据库
    4.检查查询的内容是否有被缓存, 如有缓存则返回
    5.检查查询语句, 将查询结果返回
    6.内存缓存Redis缓存对应的查询结果
    7.返回对应客户端请求的内容至于WEB节点
    8.WEB节点收到请求后返回内容至负载均衡
    9.负载均衡返回客户端内容, TCP四次断开
    5.HTTP断开连接

    http的工作原理

    1.发起dns请求
    2.获取到域名对应的IP地址
    3.浏览器发起tcp的连接
    4.基于tcp的连接,传输http的请求(一次tcp的连接,可以建立多次的http请求)
    5.浏览器请求/index.html
    6.服务器响应/index.html至浏览器
    7.浏览器翻译index.html中的内容为人类可读
    8.断开TCP的四次挥手

    DNS解析原理

    1. 查看本地主机缓存和hosts文件有没有域名与IP对应记录
    2. 本地主机向local DNS服务器(网卡上指定配置的DNS服务器)发出请求(递归查询)
    3. LOCAL DNS服务器接收到客户端主机请求,查询本地缓存信息
    4. LOCAL DNS服务向根域名服务器请求,向顶级域名服务器请求,向二级域名服务器请求(迭代查询)
    5. 获取到域名与IP地址的对应关系,是通过授权DNS服务中获取得到(得到的信息称为A记录)
           LOCAL DNS服务进行缓存A记录信息,将A记录信息发送给客户端主机
    6. 客户端主机接收到A记录信息,进行本地缓存,根据A记录中记录IP地址信息,进行网络访问

    http请求报文

    http请求报文的方法

    HTTP方法作用描述
    GET客户端请求指定资源信悤,服务器返回指定资源
    HEAD只请求响应报文中的 HTTP首部
    POST将客户端的数据提交到服务器,例:注册表单
    PUT用从客户端向服务器传送的数据取代指定的文档内容。
    DELETE请求服务器删除 Request-URI所表示的资源。
    MOVE请求服务器将指定的页面移至另一个网络地址。
    get     # 获得请求文件信息的数据内容(获取)
    post    # 用户提交数据至服务器端存储(提交)
    
    Request URL:http://10.0.0.7/index.html # 请求的URL
    Request Method:GET                     # 请求的方法
    Status Code:200 OK                     # 当前的状态
    Remote Address:10.0.0.7:80             # 远程的主机
    

    HTTP请求报文格式

    请求报文格式报文信息说明
    请求行GET / HTTP/1.1请求的起始行(请求什么信息;协议版本)
    请求头User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
    Host: www.baidu.com
    Accept: /
    请求的头部信息(客户端有关信息说明)
    空行空行信息(隔离上下文,说明请求结束)
    请求报文主体请求主体内容(只有POST 方法可以提交主体)

    请求头信息说明

    请求头内容说明
    **Host   **接受请求的服务器地址,可以是IP:端口号,也可以是域名
    **User-Agent     **发送请求的应用程序名称
    **Connection **指定与连接相关的属性,如Connection:Keep-Alive
    **Accept-Charset **通知服务端可以发送的编码格式
    Accept-Encoding通知服务端可以发送的数据压缩格式

    短连接与长连接

    http的短连接:建立一次tcp的连接,发起一次http的请求,结束,tcp断开。
    http的长连接:建立一次tcp的连接,发起多次http的请求,结束,tcp端口。

    Http响应报文

    http的响应状态码

    (以3位数字组成)
    200     成功
    301     永久重定向(redirect) 
    302     临时重定向(redirect) 
    304     浏览器缓存
    403     请求不到首页,权限被拒绝
    404     资源找不到
    500     服务器内部错误,程序代码错误
    502     找不到后端的资源
    504     请求超时

    http响应示例

    Accept-Ranges:bytes          # 接受的字节
    Connection:keep-alive        # 链接类型,keep_alive长链接
    Content-Length:2633         
    Content-Type:text/html       # 返回的页面类型
    Date:Thu, 02 Aug 2018 02:58:53 GMT
    ETag:"5aec1638-a49"
    Last-Modified:Fri, 04 May 2018 08:13:44 GMT
    Server:nginx/1.12.2         # 提供页面返回的应用服务
    

    网站流量度量术语

    独立IP数度量值

    独立IP数是指不同IP地址的计算机访问网站时被计算的总次数
    在一个局域网内多个主机进行访问相同的网站地址时,独立IP数记为多少?
    一般一天内(00:00-24:00)相同IP地址的客户端访问网站页面只会被计一次
    记录独立IP的时间可为一天或一个月,目前通用的标准为"一天"。

    页面浏览次数PV

    页面浏览量或点击量 

    独立访客数UV

    根据http请求报文:浏览器版本,OS
    根据http响应报文:cookie(id)    
    cookie(id)  将服务端的信息保存到客户端
    session     将客户端信息保存到服务器

    cookie和session区别

    cookie介绍说明

    cookie 存放在浏览器缓存中---浏览器进行查看(谷歌)
    【设置里面】---【显示高级设置】---【隐私设置】---【内容设置】---【所有cookie和内容设置】
    PS:cookie的格式信息是由开发人员进行定义,所以不同的网站所生成的cookie信息内容不太一致
    cookie 数据存放在客户的浏览器上
    cookie 不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    cookie 不占用服务器端资源,提升了服务器性能
    cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

    session介绍说明

    session 存放在服务器的内存中     
    session 数据放在服务器上
    session 从数据库的安全应用方面会更安全些
    session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能

    建议性说明:

    将登陆信息等重要信息存放为SESSION
    其他信息如果需要保留,可以放在COOKIE中

    Http相关术语题目

    如果一栋大厦里所有工作人员通过1个IP公网接口上网, 总共100个设备, 当所有人同时请求一个网站, 并且刷新了5次, 那么请求pv、ip、uv分别是多少
    pv:页面浏览量 500
    uv:唯一设备100
    ip:唯一出口 1
    并发
    A种理解:网站服务器每秒能够接收的最大用户请求数。
    B种理解:网站服务器每秒能够响应的最大用户请求数。
    C种理解:网站服务器在单位时间内能够处理的最大连接数。(推荐)

    访问网站参数说明

    用户访问网站携带的参数,以及服务端返回的参数

    概况

    Request URL: http://10.0.0.7/index.html         # 请求的URL地址
    Request Method: GET                             # 请求的方法(获取)
    Status Code: 304 Not Modified                   # 返回的状态
    Remote Address: 10.0.0.7:80                     # 请求的地址
    

    客户端请求的头部信息

    Accept: text/html,                                  # 请求的类型
    Accept-Encoding: gzip, deflate                      # 是否进行压缩
    Accept-Language: zh-CN,zh;q=0.9                     # 请求的语言
    Cache-Control: max-age=0                            # 缓存
    Connection: keep-alive                              # TCP长连接
    Host: www.nfsnobody.com                             # 请求的域名
    If-Modified-Since: Fri, 04 May 2018 08:13:44 GMT    # 修改的时间
    If-None-Match: "a49-56b5ce607fe00"                  # 标记
    Upgrade-Insecure-Requests:1                         # 在http和https之间起的一个过渡作用
    User-Agent: Mozilla/5.0                             # 用户的浏览器
    ===========请求一个空行=========================
    

    服务端响应的头部信息

    HTTP/1.1 304 Not Modified                           # 返回服务器的http协议,状态码
    Date: Fri, 14 Sep 2018 09:14:28 GMT                 # 返回服务器的时间
    Server: Apache/2.4.6 (CentOS) PHP/5.4.16            # 返回服务器使用的软件(Apache php)
    Connection: Keep-Alive                              # TCP长连接
    Keep-Alive: timeout=5, max=100                      # 长连接的超时时间
    ETag: "a49-56b5ce607fe00"                           # 验证客户端标记
    ===========返回一个空行=========================
    ===========返回内容页面=========================
    
    展开全文
  • 大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的笔记2021前端面试题系列:HTTP请求和HTTP缓存控制,此方面内容在我们的工作中常用到, 也是面试官经常提问的问题,希望下面文章对大家有所...

    大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的笔记2021前端面试题系列:HTTP请求和HTTP缓存控制,此方面内容在我们的工作中常用到, 也是面试官经常提问的问题,希望下面文章对大家有所帮助。

    1. 一次完整的HTTP服务过程

    问题分析

    当我们在web浏览器的地址栏中输入:www.baidu.com,具体发生了什么?

    1. www.baidu.com这个网址进行DNS域名解析,得到对应的IP地址
    2. 根据这个IP,找到对应的服务器,发起TCP的三次握手
    3. 建立TCP连接后发起HTTP请求
    4. 服务器响应HTTP请求,浏览器得到html代码
    5. 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)(先得到html代码,才能去找这些资源)
    6. 浏览器对页面进行渲染呈现给用户
    7. 服务器关闭关闭TCP连接

    注:

    1. DNS怎么找到域名的?

    DNS域名解析采用的是递归查询的方式,过程是,先去找DNS缓存->缓存找不到就去找根域名服务器->根域名又会去找下一级,这样递归查找之后,找到了,给我们的web浏览器

    1. 为什么HTTP协议要基于TCP来实现?

    TCP是一个端到端的可靠的面相连接的协议,HTTP基于传输层TCP协议不用担心数据传输的各种问题(当发生错误时,会重传)

    1. 最后一步浏览器是如何对页面进行渲染的?

    a)解析html文件构成 DOM树
    b)解析CSS文件构成渲染树
    c)边解析,边渲染
    d)JS 单线程运行,JS有可能修改DOM结构,意味着JS执行完成前,后续所有资源的下载是没有必要的,所以JS是单线程,会阻塞后续资源下载

    各个步骤具体细节

    DNS解析(域名解析服务器)image.png

    1. 首先会搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存)
    2. 如果浏览器自身的缓存里面没有找到,那么浏览器会搜索系统自身的DNS缓存
    3. 如果还没有找到,那么尝试从 hosts文件里面去找
    4. 在前面三个过程都没获取到的情况下,就递归地去域名服务器去查找,具体过程如下

    5rxqugj8dh.png

    DNS优化两个方面:DNS缓存、DNS负载均衡

    TCP连接建立(三次握手)

    拿到域名对应的IP地址之后,User-Agent(一般指浏览器)会以一个随机端口(1024<端口<65535)向服务器的WEB程序(常用的有httpd,nginx)等的80端口。这个连接请求(原始的http请求经过TCP/IP 4层模型的层层封包)到达服务器端后(这中间有各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终达到WEB程序,最终建立了TCP/IP的连接。

    发起HTTP请求(建立连接后)

    HTTP请求报文由三部分组成:请求行,请求头、空行 / 请求正文

    **请求行:**用于描述客户端的请求方式(GET/POST等),请求的资源名称(URL)以及使用的HTTP协议的版本号

    **请求头:**用于描述客户端请求哪台主机及其端口,以及客户端的一些环境信息等

    **空行:**空行就是\r\n (POST请求时候有)

    **请求正文:**当使用POST等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中(GET方式是保存在url地址后面,不会放到这里)

    举例:

    GET请求

    下面是浏览器对 http://localhost:8081/test?name=XXG&age=23的GET 请求时发送给服务器的数据:

    y1rj7zwfal.png

    可以看出请求包含请求行和请求头两部分。其中请求行中包含 method(例如 GET、POST)、URI(通一资源标志符)和协议版本三部分,三个部分之间以空格分开。请求行和每个请求头各占一行,以换行符 CRLF(即 \r\n)分割。

    POST请求

    下面是浏览器对 http://localhost:8081/test 的 POST 请求时发送给服务器的数据,消息体中带上参数 name=XXG&age=23

    7x1vv3oqro.png

    可以看出,上面的请求包含三个部分:请求行、请求头、空格/消息体,比之前的 GET 请求多了一个请求消息,其中 请求头和消息体之间用一个空行分割。POST 请求的参数不在 URL 中,而是在消息体中,请求头中多了一项 Content-Length 用于表示消息体的字节数,这样服务器才能知道请求是否发送结束。这也就是 GET 请求和 POST 请求的主要区别。

    那么起始行中的请求方法有哪些种呢?

    GET: 完整请求一个资源 (常用)
    HEAD: 仅请求响应首部
    POST:提交表单 (常用)
    PUT: (webdav) 上传文件(但是浏览器不支持该方法)
    DELETE:(webdav) 删除
    OPTIONS:返回请求的资源所支持的方法的方法
    TRACE: 追求一个资源请求中间所经过的代理(该方法不能由浏览器发出)

    那什么是URL、URI、URN?

    URI Uniform Resource Identifier 统一资源标识符
    URL Uniform Resource Locator 统一资源定位符
    URN Uniform Resource Name 统一资源名称

    URL和URN 都属于 URI,为了方便就把URL和URI暂时都通指一个东西

    服务器响应http请求,浏览器得到html代码

    HTTP响应也由三部分组成:状态行,响应头,空格,消息体

    状态行包括:协议版本、状态码、状态码描述

    **状态码:**状态码用于表示服务器对请求的处理结果

    1xx:指示信息——表示请求已经接受,继续处理
    2xx:成功——表示请求已经被成功接收、理解、接受。
    3xx:重定向——要完成请求必须进行更进一步的操作
    4xx:客户端错误——请求有语法错误或请求无法实现
    5xx:服务器端错误——服务器未能实现合法的请求。

    列举几种常见的:

    200(没有问题)
    302(要你去找别人)
    304(要你去拿缓存)
    307(要你去拿缓存)
    403(有这个资源,但是没有访问权限)
    404(服务器没有这个资源)
    500(服务器这边有问题)

    **响应头:**响应头用于描述服务器的基本信息,以及客户端如何处理数据

    **空格:**CRLF(即 \r\n)分割

    **消息体:**服务器返回给客户端的数据

    响应格式如下图

    vpa3scd2ea.png

    上面的 HTTP 响应中,响应头中的 Content-Length 同样用于表示消息体的字节数。Content-Type 表示消息体的类型,通常浏览网页其类型是HTML,当然还会有其他类型,比如图片、视频等。

    浏览器解析html代码,并请求html代码中的资源

    浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这是时候就用上 keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里面的顺序,但是由于每个资源大小不一样,而浏览器又是多线程请求请求资源,所以这里显示的顺序并不一定是代码里面的顺序。

    浏览器对页面进行渲染呈现给用户

    最后,浏览器利用自己内部的工作机制,把请求的静态资源和html代码进行渲染,渲染之后呈现给用户,浏览器是一个边解析边渲染的过程。

    首先浏览器解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。

    这个过程比较复杂,涉及到两个概念: reflow(回流)和repain(重绘)。

    DOM节点中的各个元素都是以盒模型的形式存在,这些都需要浏览器去计算其位置和大小等,这个过程称为relow;当盒模型的位置,大小以及其他属性,如颜色,字体,等确定下来之后,浏览器便开始绘制内容,这个过程称为repain。

    页面在首次加载时必然会经历reflow和repain。

    reflow和repain过程是非常消耗性能的,尤其是在移动设备上,它会破坏用户体验,有时会造成页面卡顿。所以我们应该尽可能少的减少reflow和repain。

    JS的解析是由浏览器中的JS解析引擎完成的。

    JS是单线程运行,JS有可能修改DOM结构,意味着JS执行完成前,后续所有资源的下载是没有必要的,所以JS是单线程,会阻塞后续资源下载。

    浏览器解析html流程如下图
    image.png

    服务器关闭关闭TCP连接

    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:

    Connection:keep-alive
    

    TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

    以上流程就是一次完整的HTTP服务过程.

    面试题点

    1. 地址栏输入url开始, 域名到ip的过程
    2. 拿到ip, 开始建立http请求
    3. 拿到html之后的浏览器的渲染过程

    回答思路

    先说从url到拿到html的过程,然后重点阐述html的渲染过程。之后面试官再次提问的侧重回答(如:重排,重绘、tcp 三次握手四次挥手)。
    

    相关扩展

    1. tcp 三次握手四次挥手

    2. http缓存控制

    面试问题分析

    Web 缓存大致可以分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存。

    浏览器缓存也包含很多内容: HTTP 缓存、indexDB、cookie、localstorage 等等。这里我们只讨论 HTTP 缓存相关内容。

    在具体了解 HTTP 缓存之前先来明确几个术语:

    • 缓存命中率:从缓存中得到数据的请求数与所有请求数的比率。理想状态是越高越好。
    • 过期内容:超过设置的有效时间,被标记为“陈旧”的内容。通常过期内容不能用于回复客户端的请求,必须重新向源服务器请求新的内容或者验证缓存的内容是否仍然准备。
    • 验证:验证缓存中的过期内容是否仍然有效,验证通过的话刷新过期时间。
    • 失效:失效就是把内容从缓存中移除。当内容发生改变时就必须移除失效的内容。

    浏览器缓存主要是 HTTP 协议定义的缓存机制。HTML meta 标签,例如
    含义是让浏览器不缓存当前页面。但是代理服务器不解析 HTML 内容,一般应用广泛的是用 HTTP 头信息控制缓存。

    浏览器缓存分类

    浏览器缓存分为强缓存和协商缓存,浏览器加载一个页面的简单流程如下:

    1. 浏览器先根据这个资源的http头信息来判断是否命中强缓存。如果命中则直接加在缓存中的资源,并不会将请求发送到服务器。(强缓存)
    2. 如果未命中强缓存,则浏览器会将资源加载请求发送到服务器。服务器来判断浏览器本地缓存是否失效。若可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。(协商缓存)
    3. 如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。(新的请求)
    1. 强缓存

    命中强缓存时,浏览器并不会将请求发送给服务器。在Chrome的开发者工具中看到http的返回码是200,但是在Size列会显示为(from cache)。

    940884-20180423141536107-329179455.png

    强缓存是利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间。

    Expires

    缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点。也就是说,Expires=max-age + 请求时间,需要和Last-modified结合使用。但在上面我们提到过,cache-control的优先级更高。 Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。

    940884-20180423141609527-358000355.png

    该字段会返回一个时间,比如Expires:Thu,31 Dec 2037 23:59:59 GMT。这个时间代表着这个资源的失效时间,也就是说在2037年12月31日23点59分59秒之前都是有效的,即命中缓存。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当客户端本地时间被修改以后,服务器与客户端时间偏差变大以后,就会导致缓存混乱。于是发展出了Cache-Control。

    Cache-Control

    Cache-Control是一个相对时间,例如Cache-Control:3600,代表着资源的有效期是3600秒。由于是相对时间,并且都是与客户端时间比较,所以服务器与客户端时间偏差也不会导致问题。
    Cache-Control与Expires可以在服务端配置同时启用或者启用任意一个,同时启用的时候Cache-Control优先级高。

    Cache-Control 可以由多个字段组合而成,主要有以下几个取值:

    1. max-age 指定一个时间长度,在这个时间段内缓存是有效的,单位是s。例如设置 Cache-Control:max-age=31536000,也就是说缓存有效期为(31536000 / 24 / 60 * 60)天,第一次访问这个资源的时候,服务器端也返回了 Expires 字段,并且过期时间是一年后。
      940884-20180423141638673-1917674992.png

    在没有禁用缓存并且没有超过有效时间的情况下,再次访问这个资源就命中了缓存,不会向服务器请求资源而是直接从浏览器缓存中取。

    在没有禁用缓存并且没有超过有效时间的情况下,再次访问这个资源就命中了缓存,不会向服务器请求资源而是直接从浏览器缓存中取。

    1. s-maxage 同 max-age,覆盖 max-age、Expires,但仅适用于共享缓存,在私有缓存中被忽略。
    2. public 表明响应可以被任何对象(发送请求的客户端、代理服务器等等)缓存。
    3. private 表明响应只能被单个用户(可能是操作系统用户、浏览器用户)缓存,是非共享的,不能被代理服务器缓存。
    4. no-cache 强制所有缓存了该响应的用户,在使用已缓存的数据前,发送带验证器的请求到服务器。不是字面意思上的不缓存。
    5. no-store 禁止缓存,每次请求都要向服务器重新获取数据。

    7.must-revalidate指定如果页面是过期的,则去服务器进行获取。这个指令并不常用,就不做过多的讨论了。
    强缓存流程图
    image.png

    2. 协商缓存

    若未命中强缓存,则浏览器会将请求发送至服务器。服务器根据http头信息中的Last-Modify/If-Modify-Since或Etag/If-None-Match来判断是否命中协商缓存。如果命中,则http返回码为304,浏览器从缓存中加载资源。

    Last-Modify/If-Modify-Since

    浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间,例如Last-Modify: Thu,31 Dec 2037 23:59:59 GMT

    940884-20180423141852114-1757065670.png

    当浏览器再次请求该资源时,发送的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。

    940884-20180423141732879-1484228353.png

    如果命中缓存,则返回http304,并且不会返回资源内容,并且不会返回Last-Modify。由于对比的服务端时间,所以客户端与服务端时间差距不会导致问题。但是有时候通过最后修改时间来判断资源是否修改还是不太准确(资源变化了最后修改时间也可以一致)。于是出现了ETag/If-None-Match。

    ETag/If-None-Match

    与Last-Modify/If-Modify-Since不同的是,Etag/If-None-Match返回的是一个校验码(ETag: entity tag)。ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化*。ETag值的变更则说明资源状态已经被修改。服务器根据浏览器上发送的If-None-Match值来判断是否命中缓存。
    940884-20180423141918779-1206116367.png

    ETag扩展说明

    我们对ETag寄予厚望,希望它对于每一个url生成唯一的值,资源变化时ETag也发生变化。神秘的Etag是如何生成的呢?以Apache为例,ETag生成靠以下几种因子

    1. 文件的i-node编号,此i-node非彼iNode。是Linux/Unix用来识别文件的编号。是的,识别文件用的不是文件名。使用命令’ls –I’可以看到。
    2. 文件最后修改时间
    3. 文件大小
      生成Etag的时候,可以使用其中一种或几种因子,使用抗碰撞散列函数来生成。所以,理论上ETag也是会重复的,只是概率小到可以忽略。

    既生Last-Modified何生Etag?

    你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

    1. Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间
    2. 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存

    3.有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

    Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

    浏览器第一次请求

    940884-20180423141945261-83532090.png

    浏览器第二次请求

    940884-20180423141951735-912699213.png

    面试题点

    1. http缓存作用范围

    http缓存能够帮助服务器提高并发性能,很多资源不需要重复请求直接从浏览器中拿缓存

    1. http缓存分类

    强缓存 协商缓存

    1. http缓存实现技术

    强缓存: 通过 expires 和 cache-control控制
    协商缓存: 通过 last-Modify 和E-tag控制

    其他:

    1. 为什么有expires 有需要cache-control

      因为expires 有个服务器和浏览器时间不同步的问题
      expires是绝对事件   cache-control是相对时间
      
    2. last-modify和Etag
      last-modify 它是有个精度问题 到秒
      e-tag 没有精度问题 只要文件改变 e-tag值就改变

    回答思路

    首先回答http缓存的作用范围, 然后点出http缓存主要分为强缓存和协商缓存。最后重点阐述强缓存和协商缓存的配置实现和相关http响应头字段的用法。
    

    相关扩展

    1. 用户行为与缓存 浏览器缓存行为还有用户的行为有关!!!
      (https://img-blog.csdnimg.cn/af29341b998546f7976d605e969129ab.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YmN56uv5bKa5p6r,size_20,color_FFFFFF,t_70,g_se,x_16)

    2. 服务器端的缓存 CDN 、redis、数据库缓存等

    3. Nginx下关于缓存控制字段cache-control的配置说明

    关注公众号:程序员石磊 获取更多前端面试题

    展开全文
  • HTTP1.0、HTTP1.1、HTTP2.0、HTTPS的区别

    千次阅读 2021-01-18 11:24:04
    目录HTTP1.0 和 HTTP1.1 的区别HTTP 和 HTTPSSPDY:HTTP1.x的优化HTTP2.0:SPDY的升级版HTTP2.0和HTTP1.X相比的新特性HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别服务器推送是什么 HTTP1.0 和 HTTP1.1 的...

    1. HTTP1.0 和 HTTP1.1 的区别

    HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在:

    1. 短连接和长连接

    在HTTP/1.0中,默认使用的是短连接,也就是说每次请求都要重新建立一次TCP连接。HTTP 是基于TCP/IP协议的,每一次建立或者断开连接都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大。因此最好能维持一个长连接,可以用个长连接来发多个请求。

    HTTP 1.1起,默认使用长连接,默认开启Connection: keep-alive。 HTTP/1.1的持续连接有非流水线方式和流水线方式 。流水线方式是客户在收到HTTP的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求。

    2. 错误状态响应码

    在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

    3. 缓存处理

    在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

    4. 带宽优化及网络连接的使用

    HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

    5. Host头处理

    在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
     
     

    2. HTTP 和 HTTPS

    1. 端口

    HTTP的URL由“http://”起始且默认使用端口80,而HTTPS的URL由“https://”起始且默认使用端口443。

    2. 安全性和资源消耗

    HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是说 HTTPS 使用了隧道进行通信(如下图)。通过使用 SSL,HTTPS 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。HTTPS所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。
     
    在这里插入图片描述

     

    加密

    1. 对称密钥加密

    对称密钥加密(Symmetric-Key Encryption),加密和解密使用同一密钥。

    优点:运算速度快;
    缺点:无法安全地将密钥传输给通信方。

    在这里插入图片描述
    2.非对称密钥加密

    非对称密钥加密,又称公开密钥加密(Public-Key Encryption),加密和解密使用不同的密钥。

    公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。

    非对称密钥除了用来加密,还可以用来进行签名。因为私有密钥无法被其他人获取,因此通信发送方使用其私有密钥进行签名,通信接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确。

    优点:可以更安全地将公开密钥传输给通信发送方;
    缺点:运算速度慢。

    在这里插入图片描述

    HTTPS 采用的加密方式

    上面提到对称密钥加密方式的传输效率更高,但是无法安全地将密钥 Secret Key 传输给通信方。而非对称密钥加密方式可以保证传输的安全性,因此我们可以利用非对称密钥加密方式将 Secret Key 传输给通信方。HTTPS 采用混合的加密机制,正是利用了上面提到的方案:

    • 使用非对称密钥加密方式,传输对称密钥加密方式所需要的 Secret Key,从而保证安全性;
    • 获取到 Secret Key 后,再使用对称密钥加密方式进行通信,从而保证效率。

    补充:什么是SSL/TLS协议?

    SSL“安全套接层”协议,TLS“安全传输层”协议,都属于是加密协议,在其网络数据传输中起到保护隐私和数据的完整性。保证该网络传输的信息不会被未经授权的元素拦截或修改,从而确保只有合法的发送者和接收者才能完全访问并传输信息。

     
     

    3. SPDY:HTTP1.x的优化

    2012年google如一声惊雷提出了SPDY的方案,优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性,具体如下:

    1. 降低延迟

    针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。

    2. 请求优先级(request prioritization)

    多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容。

    3. header压缩

    前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。

    4. 基于HTTPS的加密协议传输

    大大提高了传输数据的可靠性。

    5. 服务端推送(server push)

    采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。

    SPDY构成图:

    在这里插入图片描述

    SPDY位于HTTP之下,TCP和SSL之上,这样可以轻松兼容老版本的HTTP协议(将HTTP1.x的内容封装成一种新的frame格式),同时可以使用已有的SSL功能。
     
     

    4. HTTP2.0:SPDY的升级版

    HTTP2.0可以说是SPDY的升级版(其实原本也是基于SPDY设计的),但是,HTTP2.0 跟 SPDY 仍有不同的地方,如下:

    1. HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
    2. HTTP2.0 消息头的压缩算法采用 HPACK ,而非 SPDY 采用的 DEFLATE
       
       

    5. HTTP2.0和HTTP1.X相比的新特性

    1. 新的二进制格式(Binary Format)

    HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

    2. 多路复用(MultiPlexing

    即连接共享,即每一个request都是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

    3. header压缩

    HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

    4. 服务端推送(server push)

    同SPDY一样,HTTP2.0也具有server push功能。

     
     

    6. HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别

    • HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
    • HTTP/1.1 Pipeling 解决方式为:若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
    • HTTP/2 多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;

    在这里插入图片描述

    在这里插入图片描述
     
     

    7. 服务器推送是什么

    服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。

    普通的客户端请求过程

    在这里插入图片描述
     
    服务端推送的过程
    在这里插入图片描述
     
     

    参考:
    https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A?

    展开全文
  • 使用nodejs和express搭建http web服务

    千次阅读 2021-01-15 19:24:19
    nodejs作为一个优秀的异步IO框架,其本身就是用来作为http web服务器使用的,nodejs中的http模块,提供了很多非常有用的http相关的功能。 虽然nodejs已经带有http的处理模块,但是对于现代web应用程序来说,这或许...

    简介

    nodejs作为一个优秀的异步IO框架,其本身就是用来作为http web服务器使用的,nodejs中的http模块,提供了很多非常有用的http相关的功能。

    虽然nodejs已经带有http的处理模块,但是对于现代web应用程序来说,这或许还不太够,于是我们有了express框架,来对nodejs的内容进行扩展。

    今天我们将会介绍一下使用nodejs和express来开发web应用程序的区别。

    使用nodejs搭建HTTP web服务

    nodejs提供了http模块,我们可以很方便的使用http模块来创建一个web服务:

    const http = require('http')
    
    const hostname = '127.0.0.1'
    const port = 3000
    
    const server = http.createServer((req, res) => {
      res.statusCode = 200
      res.setHeader('Content-Type', 'text/plain')
      res.end('welcome to www.flydean.com\n')
    })
    
    server.listen(port, hostname, () => {
      console.log(`please visit http://${hostname}:${port}/`)
    })
    

    上面创建的http服务监听在3000端口。我们通过使用createServer方法来创建这个http服务。

    该方法接受一个callback函数,函数的两个参数分别是 req (http.IncomingMessage 对象)和一个res(http.ServerResponse 对像)。

    在上面的例子中,我们在response中设置了header和body值,并且以一个end方法来结束response。

    请求nodejs服务

    我们创建好http web服务之后,一般情况下是从web浏览器端进行访问和调用。但是我们有时候也需要从nodejs后端服务中调用第三方应用的http接口,下面的例子将会展示如何使用nodejs来调用http服务。

    先看一个最简单的get请求:

    const http = require('http')
    const options = {
      hostname: 'www.flydean.com',
      port: 80,
      path: '/',
      method: 'GET'
    }
    
    const req = http.request(options, res => {
      console.log(`status code: ${res.statusCode}`)
    
      res.on('data', d => {
        console.log(d);
      })
    })
    
    req.on('error', error => {
      console.error(error)
    })
    
    req.end()
    

    上面代码我们使用了http.request来创建一个request,并且传入了我们自带的options参数。

    我们通过res的回调事件来进行相应的处理。

    再看一个简单的post请求:

    const http = require('http')
    
    const data = JSON.stringify({
      name: 'flydean'
    })
    
    const options = {
      hostname: 'www.flydean.com',
      port: 80,
      path: '/',
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Content-Length': data.length
      }
    }
    
    const req = http.request(options, res => {
      console.log(`status code: ${res.statusCode}`)
    
      res.on('data', d => {
        console.log(d);
      })
    })
    
    req.on('error', error => {
      console.error(error)
    })
    
    req.write(data)
    req.end()
    

    post和get相似,不同的是options中的method不一样,同时put可以有多种请求类型,所以我们需要在headers中指定。

    同样的,PUT 和 DELETE 也可以使用同样的方式来调用。

    第三方lib请求post

    直接使用nodejs底层的http.request有点复杂,我们需要自己构建options,如果使用第三方库,比如axios可以让post请求变得更加简单:

    const axios = require('axios')
    
    axios
      .post('http://www.flydean.com', {
        name: 'flydean'
      })
      .then(res => {
        console.log(`status code: ${res.statusCode}`)
        console.log(res)
      })
      .catch(error => {
        console.error(error)
      })
    

    上面的例子中,我们直接使用axios的post请求,并将请求结果封存成了promise,然后通过then和catch来进行相应数据的处理。非常的方便。

    获取http请求的正文

    在上面的例子中,我们通过监听req的data事件来输出http请求的正文:

      res.on('data', d => {
        console.log(d);
      })
    })
    

    这样做其实是有问题的,并不一定能够获得完整的http请求的正文。

    因为res的on data事件是在服务器获得http请求头的时候触发的,这个时候请求的正文可能还没有传输完成,换句话说,请求回调中的request是一个流对象。

    我们需要这样处理:

    const server = http.createServer((req, res) => {
      let data = []
      req.on('data', chunk => {
        data.push(chunk)
      })
      req.on('end', () => {
        console.log(JSON.parse(data));
      })
    })
    

    当每次触发data事件的时候,我们将接受到的值push到一个数组里面,等所有的值都接收完毕,触发end事件的时候,再统一进行输出。

    这样处理显然有点麻烦。

    我们介绍一个在express框架中的简单方法,使用 body-parser 模块:

    const bodyParser = require('body-parser')
    
    app.use(
      bodyParser.urlencoded({
        extended: true
      })
    )
    
    app.use(bodyParser.json())
    
    app.post('/', (req, res) => {
      console.log(req.body)
    })
    

    上面的例子中,body-parser对req进行了封装,我们只用关注与最后的结果即可。

    Express和使用express搭建http web服务

    express是什么呢?

    express是基于 Node.js 平台,快速、开放、极简的 web 开发框架。它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。

    丰富的 HTTP 快捷方法和任意排列组合的 Connect 中间件,让你创建健壮、友好的 API 变得既快速又简单。

    Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功能。

    express helloworld

    我们看一下怎么使用Express来搭建一个helloworld:

    var express = require('express');
    var app = express();
    app.get('/', function (req, res) {
      res.send('Hello World!');
    });
    var server = app.listen(3000, function () {
      var host = server.address().address;
      var port = server.address().port;
      console.log('Example app listening at http://%s:%s', host, port);
    });
    
    

    简单的使用app.listen即可搭建好一个http web服务。

    express路由

    有了web服务,我们需要对不同的请求路径和请求方式进行不同的处理,这时候就需要使用到了express路由功能:

    // 对网站首页的访问返回 "Hello World!" 字样
    app.get('/', function (req, res) {
      res.send('Hello World!');});
    // 网站首页接受 POST 请求
    app.post('/', function (req, res) {
      res.send('Got a POST request');});
    // /user 节点接受 PUT 请求
    app.put('/user', function (req, res) {
      res.send('Got a PUT request at /user');});
    // /user 节点接受 DELETE 请求
    app.delete('/user', function (req, res) {
      res.send('Got a DELETE request at /user');});
    

    更高级一点的,我们还可以在请求路径中做路由匹配:

    // 匹配 acd 和 abcd
    app.get('/ab?cd', function(req, res) {
      res.send('ab?cd');});
    // 匹配 abcd、abbcd、abbbcd等
    app.get('/ab+cd', function(req, res) {
      res.send('ab+cd');
    });
    // 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
    app.get('/ab*cd', function(req, res) {
      res.send('ab*cd');
    });
    // 匹配 /abe 和 /abcde
    app.get('/ab(cd)?e', function(req, res) {
     res.send('ab(cd)?e');});
    
    // 匹配任何路径中含有 a 的路径:
    app.get(/a/, function(req, res) {
      res.send('/a/');
    });
    
    // 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
    app.get(/.*fly$/, function(req, res) {
      res.send('/.*fly$/');
    });
    
    

    Express 路由句柄中间件

    有时候,一个请求可能有多个处理器,express提供了路由句柄(中间件)的功能,我们可自由组合处理程序。

    注意,在路由句柄中,我们需要调用next方法,来触发下一个路由方法。

    var cb0 = function (req, res, next) {
      console.log('CB0');
      next();}
    var cb1 = function (req, res, next) {
      console.log('CB1');
      next();}
    app.get('/example/d', [cb0, cb1], function (req, res, next) {
      console.log('response will be sent by the next function ...');
      next();
    }, function (req, res) {
      res.send('Hello from D!');
    });
    

    上面的请求会经过cb0,cb1和自定义的两个function,最终结束。

    Express 响应方法

    express提供了很多响应方法API,可以方便我们的代码编写:

    方法描述
    res.download()提示下载文件。
    res.end()终结响应处理流程。
    res.json()发送一个 JSON 格式的响应。
    res.jsonp()发送一个支持 JSONP 的 JSON 格式的响应。
    res.redirect()重定向请求。
    res.render()渲染视图模板。
    res.send()发送各种类型的响应。
    res.sendFile以八位字节流的形式发送文件。
    res.sendStatus()设置响应状态代码,并将其以字符串形式作为响应体的一部分发送。

    Express 的静态资源

    通常来说,静态资源是不需要服务端进行处理的,在express中,可以使用express.static来指定静态资源的路径:

    app.use(express.static('public'));
    现在,public 目录下面的文件就可以访问了。
    http://localhost:3000/images/kitten.jpg
    http://localhost:3000/css/style.css
    http://localhost:3000/js/app.js
    http://localhost:3000/images/bg.png
    http://localhost:3000/hello.html
    //多个静态资源目录
    app.use(express.static('public'));
    app.use(express.static('files'));
    //静态前缀
    app.use('/static', express.static('public'));
    http://localhost:3000/static/images/kitten.jpg
    http://localhost:3000/static/css/style.css
    

    Express 使用模板引擎

    web应用当然需要html文件,express中可以使用多种模板语言,让编写html页面更加容易。如果想要使用模板引擎。我们可以使用下面的步骤:

    1. views, 放模板文件的目录,比如: app.set(‘views’, ‘./views’)

    2. view engine, 模板引擎,比如: app.set(‘view engine’, ‘jade’)

    3. 在 views 目录下生成名为 index.jade 的 Jade 模板文件,内容如下:

    html
      head
        title!= title
      body
        h1!= message
    
    1. 在nodejs服务端配置route规则
    //配置route 规则
    app.get('/', function (req, res) {
      res.render('index', { title: 'Hey', message: 'Hello there!'});
    });
    

    总结

    nodejs和express是非常方便的http web服务框架,希望大家能够喜欢。

    本文作者:flydean程序那些事

    本文链接:http://www.flydean.com/nodejs-http-express/

    本文来源:flydean的博客

    欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

    展开全文
  • 文章目录 目的 基础说明 使用演示 示例一 示例二 示例三 库说明 方法说明 状态码与错误代码 总结 目的 很多时候我们需要ESP32去访问外网的服务器,HTTP服务器是最常见的服务器,在这个时候就需要ESP32作为HTTPClient...
  • 现在想想无论分享什么内容都需要慢慢积累, 所以还是决定将之前整理的相关内容验证之后慢慢分享给大家 这个专题就是 HTTP协议原理与实践代码 相关的内容; 不积跬步,无以至千里, 戒焦戒躁 。 好了废话不多说, 直接上...
  • 目录1、认识Http1.1、什么是Http1.2、什么是超文本1.3、万维网2、HTTP报文格式2.1、HTTP请求报文格式2.2、HTTP响应报文格式3、使用Cookie在服务器上记录用户信息3.1、Cookie概念3.2、具体过程4、HTTP1.0和HTTP1.14.1...
  • ESP32 HTTP Client接口使用

    千次阅读 2020-12-21 17:44:11
    记录下ESP32自带的HTTP接口的使用, ESP HTTP模块提供了丰富的API支持HTTP/HTTPS的请求,模块位于esp-idf\components\esp_http_client中,其中Kconfig可修改默认使能HTTPS和身份验证,在menuconfig也可以进行配置 ...
  • 国内最新免费HTTP代理IP

    千次阅读 2021-07-07 13:42:20
    110.86.177.154:9999 [未知代理ip] 中国福建省莆田市 电信免费HTTP 175.146.102.146:9999 [普匿代理ip] 中国辽宁省鞍山市 联通免费HTTP 112.123.40.232:9999 [高匿代理ip] 中国安徽省池州市 联通免费HTTP 114.238....
  • 冰河就趁着周末,只用了几个Java类就简单的实现了Http协议,爽!!
  • 服务器存在缓慢的HTTP拒绝服务攻击

    万次阅读 多人点赞 2021-08-17 14:37:04
    缓慢的HTTP拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量HTTP请求攻击,直到服务器带宽被打满,造成了拒绝服务。 慢速HTTP拒绝服务攻击经过不断的演变和...
  • C++写一个http服务器/web服务器

    万次阅读 2021-02-02 18:39:49
    其实这篇文章一直想写,苦于没有时间,想一气呵成写完,在离回家前一天晚上,在上海的小宾馆里面异常兴奋,写一下如何用C++搭建一个简易的http服务器。 我相信大部分人都希望渴望一个自己的网站(哪怕在破在破也是...
  • http方式调用接口服务方法

    千次阅读 2021-02-25 15:11:58
    调用其他服务方法时,除了dubbo、rmq等方式外,还可以采取http方式调取对方服务的url,获取响应数据,可以采用HttpClient或CloseableHttpClient等接口实现http调用请求 使用HttpClient发送请求的一般步骤 ,如下所...
  • gRPC和HTTP区别

    千次阅读 2021-07-10 20:21:18
    但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先(基于TCP协议的情况下)就是长链接,不必每次通信都要像http 一样去3次握手什么的,减少了网络开销;其次就是RPC...
  • 文章目录系列文章目录前言HTTP Client二、使用步骤1.引入库2.读入数据总结 前言 当我们在开发调试Web服务的时候,需要调用开发的接口进行验证测试,或者调用远程的接口进行联调。相信大家首选的工具一般会是...
  • netty系列之:让TLS支持http2

    千次阅读 2021-10-20 09:05:54
    我们知道虽然HTTP2协议并不强制使用HTTPS,但是对大多数浏览器来说,如果要使用HTTP2的话,则必须使用HTTPS,所以我们需要了解如何在netty的TLS中支持http2。 TLS的扩展协议NPN和ALPN HTTP2协议是从spdy协议发展而来...
  • Java如何发起http请求

    千次阅读 多人点赞 2021-02-22 21:01:06
    Java如何发起http请求前言一、GET与POST1.GET方法2.POST方法实现代码实例演示字符串转json结束 前言 在未来做项目中,一些功能模块可能会采用不同的语言进行编写。这就需要http请求进行模块的调用。那么下面,我将...
  • HttpRunner 3.x使用文档

    千次阅读 2020-12-28 18:43:17
    httprunner简介1.1 简介1.2 参考资料1.3 框架的优点二. 安装2.1 安装命令2.2 检查是否安装成功三. 录制接口请求3.1 生成pytest测试脚本:3.2 生成yml文件3.3 生成json文件四. 脚手架快速生成项目4.1 快速生成项目...
  • Reactor 模型中增加HTTP协议 在 实现GET方法 实现POST方法 实现CGI
  • 文章目录前言参数说明HTTP 输出工作数量HTTP 输出队列代码逻辑调用图 前言 GoReplay 对数据流的抽象出了两个概念,即用**输入(input )和输出(output )**来表示数据来源与去向,统称为 plugin,用介于输入和输出...
  • 您可能感兴趣的话题:python核心提示: 本文实例讲述了python通过get,post方式发送http请求和接收http响应的方法。分享给大家供大家参考。本文实例讲述了python通过get,post方式发送http请求和接收http响应的方法。...
  • C语言实现简单HTTP 服务器

    万次阅读 2021-09-08 18:27:55
    开发平台:Microsoft Visual Studio Community 2019 #include #include #include #...//发送完直接关闭 因为HTTP协议是无连接的 } //7.关闭连接,清理网络库 closesocket(serverSocket); WSACleanup(); return 0; }
  • netty系列之:搭建HTTP上传文件服务器

    万次阅读 2021-09-06 12:56:02
    上一篇的文章中,我们讲到了如何从HTTP服务器中下载文件,和搭建下载文件服务器应该注意的问题,使用的GET方法。本文将会讨论一下常用的向服务器提交数据的POST方法和如何向服务器上传文件。
  • windows obs nginx-http-flv-module
  • wireshark分析http协议详解

    千次阅读 2021-02-22 14:29:27
    wireshark工具一、wireshark分析示例二、curl命令查看HTTP响应头信息 一、wireshark分析示例 1.清空缓存 在进行跟踪之前,首先清空Web浏览器的高速缓存来确保Web网页是从网络中获取的,而不是从高速缓冲中取得的。...
  • HttpCanary

    千次阅读 2021-01-17 11:48:57
    HttpCanary是一款功能十分强大网络抓包工具,它可以分析多个协议HTTP、https、http2等,这是一款最新的专为移动端设计的抓包工具,用户可以根据这个工具来应用,使用非常的简单,一学就会。对这款HttpCanary感兴趣的...
  • http网络及安全防护面试题及答案

    千次阅读 2021-01-23 23:20:37
    1. Http 状态码,Http2 是什么 答案: 200 欢迎回来,主人 (正常;请求已完成。) 301 人家搬家了 (已移动 — 请求的数据具有新的位置且更改是永久的。) 307 不是这里,换个地方啦 (重新请求的 URL,客户端自动...
  • 解密协议层的攻击——HTTP请求走私

    千次阅读 2021-02-18 20:49:22
    最近一直在研究一些比较有意思的攻击方法与思路,在查阅本地文档的时候(没错,本地,我经常会将一些有意思的文章但是没时间看就会被我保存pdf到本地),一篇2019年Black hat的议题——HTTP请求走私,进入我的视野,...
  • 02 网络面经:一个TCP连接可以发送多少个HTTP请求?

    千次阅读 多人点赞 2021-08-25 09:27:13
    一个TCP连接可以发送多少个HTTP请求?就这这个问题,我们聊聊TCP、HTTP以及浏览器之间的关系和对请求处理的优化。 TCP与HTTP的渊源 我们知道TCP协议对应于传输层,HTTP协议对应于应用层。WEB项目中,HTTP协议是建立...
  • HTTP协议违背事件分析

    千次阅读 2021-11-12 18:03:50
    HTTP协议违背 1.1 请求URI过长 告警信息:the requested URL's length exceeds the capacity limit 描述:HTTP请求URI长度超过默认缓冲区大小,认为其不合规 1.2 请求头部过长 告警信息:request exceeds system...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,749,654
精华内容 5,099,861
关键字:

htpp