当前位置: 首页 > Web前端 > HTML

HTTP在前端的应用

时间:2023-03-28 15:43:34 HTML

最近打算写一些前端知识的总结和个人的看法。这是第一篇,先写HTTP相关的东西。之前写过一篇关于curl命令和HTTP请求的文章,里面也提到了一些关于HTTP的东西。本文将补充更多。什么是HTTP?HTTP全称超文本传输??协议(HyperTextTransferProtocol),是一种简单的数据传输请求-响应协议。HTTP诞生之初,主要是用来获取WEB端的内容。随着互联网的发展,开始展示更多的内容(更多的图片文件),布局变得更加精美(更多的CSS),也引入了更复杂的交互(更多的JS)。加载的数据总量和用户打开网站首页时加载的请求数也在增加。所以HTTP也在不断发展。完整的HTTP请求体可以在之前的文章《curl命令与HTTP请求》中找到。常见的HTTP请求方法、状态消息、头部(headers)请求方法GET方法GET是最常用的HTTP请求方法,会显示请求指定的资源,并返回响应体,一般期望安全和幂等(意味着对同一个URL的多个请求应该返回相同的结果)。所谓安全,就是操作是用来获取信息的,而不是修改信息的。换句话说,GET请求通常不应有副作用。也就是说,它只是获取资源信息,就像数据库查询一样,不会修改或增加数据,不会影响资源的状态。POST方法POST方法用于向指定资源提交数据,请求服务器处理(如提交表单或上传文件),数据包含在请求体中。POST请求可以创建新资源、修改现有资源或两者兼而有之。每次提交时,表单数据都由浏览器编码到HTTP请求的正文中。浏览器发送的POST请求的body主要格式为application/x-www-form-urlencoded,用于传输简单数据,如“key1=value1&key2=value2”。multipart/form-data主要用于传输文件内容。application/json告诉服务器消息正文是一个序列化的JSON字符串。text/plain纯文本格式下图是关于GET和POST的区别。HEAD方法与GET方法相同。它向服务器发送一个指定资源的请求,但是服务器不会返回资源的文本部分,只会返回头信息。它的优点是,通过使用这种方法,您可以获取“有关资源的信息”(元信息或元数据),而无需传输所有内容,并检查资源的标头,例如:如果GET/users返回一个列表的用户,然后HEAD/users会发出相同的请求,但不会返回用户列表。HEAD方法的使用场景是在不获取资源的情况下,知道资源的一些信息,比如资源类型;通过检查响应中的状态码,可以判断资源是否存在;通过检查头部,测试资源是否被修改。PUT方法PUT方法用于向服务器发送数据以创建/更新资源。PUT方法和POST方法的区别在于PUT方法是幂等的:调用一次相当于连续调用多次(即没有副作用),而连续调用POST方法多次可能会有副作用,比如重复提交订单。DELETE方法DELETE方法是请求服务器删除指定URL对应的资源。但是,客户端不能保证删除操作一定会执行,因为HTTP规范允许服务器在不通知客户端的情况下撤回请求。OPTIONS方法OPTIONS方法用于获取目标资源支持的通信选项。客户端可以对特定URL或整个站点(通过将URL设置为“*”)使用OPTIONS方法。如果请求成功,会在HTTP头中包含一个名为“Allow”的头,值为支持的方法,如“GET、POST”。使用示例可以使用OPTIONS方法向服务器发起请求,检测服务器支持哪些HTTP方法。响应消息包含一个Allow标头字段,其值指示服务器支持的所有HTTP方法:HTTP/1.1200OKAllow:OPTIONS,GET,HEAD,POSTCache-Control:max-age=604800Date:Thu,13Oct201611:45:00GMTExpires:Thu,20Oct201611:45:00GMTServer:EOS(lax004/2813)x-ec-custom-error:1Content-Length:0个人观点其实不管是什么请求方式,请求的数据可以放在URL或正文中。没有说GET请求的数据只能放在URL中,POST的请求只能放在body中。只是在发起GET请求时,放在body中的数据会被忽略或警告。当发出POST请求时,数据也可以放在URL上。这时候后端获取数据的方法应该使用getQueryString方法,但是这样就违背了POST请求的初衷,所以在使用POST请求的时候,尽量把数据放上去。在身体上。常见状态信息(状态码)2xx:成功200OK——请求成功3xx:重定向302Found——请求的页面已经暂时转移到新的url。304NotModified-文档未按预期修改。客户端已缓存文档并发出条件请求(通常通过提供If-Modified-Since标头指示客户端只需要比指定日期更新的文档)。服务器告诉客户端可以继续使用原来缓存的文档。4xx:Clienterror400BadRequest-错误请求,客户端请求有语法错误,无法被服务器理解。401Unauthorized——未授权,客户端的请求需要认证,服务端认证失败。403Forbidden-禁止访问请求的页面404NotFound-服务器找不到请求的页面405MethodNotAllowed-不允许请求中指定的方法5xx:服务器错误500InternalServerError-请求未完成,服务器遇到不可预知的情况501NotImplemented-请求未完成,服务器不支持请求的功能502BadGateway-请求未完成,服务器收到来自上游服务器的无效响应503ServiceUnavailable-the请求未完成,服务器暂时过载或Downtime504GatewayTimeout-网关超时commonHEADERS请求头RequestHeader字段名表示Accept用户代理可以处理的媒体类型,表示客户端想要接收的数据类型Accept-Charsetpriority字符集Accept-Encoding优先内容编码Host指定资源所在的服务器d.Referer告诉服务器该网页链接自哪个页面。If-Match比较的是实体标签(ETag)If-Modified-Since比较的是资源的更新时间。If-None-Match比较实体标签(If-Match的反义词)ResponseHeaderResponseHeader字段名描述了ETag资源的匹配信息Location将客户端重定向到指定的URIServer包含了原始服务器使用的软件信息处理请求Last-Modified资源修改日期和时间Access-Control-Allow-Methodsclearclient此外,还有一些通用的header可以用于请求或响应的字段名描述。Content-Type实体头用于指示资源的MIME类型(媒体类型)。Content-Encoding实体体适用的编码方式Content-Length实体体大小(字节)HTTPHeader更多信息请参考MDNHTTP文档浏览器缓存机制介绍一般情况下,实现缓存的认证机制有以下三种:Set资源的有效时间。比较资源的最新修改时间。比较资源的唯一标识符(ETag,类似于版本号,当资源发生变化时,标识符也会随之变化)。设置资源生效时间。当客户端完成第一个请求时,服务器会在响应头中添加一个Cache-Control或Expires字段来表示资源的有效时间。浏览器第二次发送请求时,会先根据该字段进行校验,如果在有效时间内,则直接使用资源副本。注意:Expires是HTTP1.0的一个字段,Cache-Control是HTTP1.1的一个字段。当Expires和Cache-Control同时存在时,Cache-Control的优先级高于Expires。所以上面提到的Expires可以忽略。因为Cache-Control比Expires更加具体和详细。参考Cache-Control文档比较资源的最新修改时间。该方法主要是利用Last-Modified和If-Modified-Since的配合完成的:当客户端完成第一次请求后,服务端会在响应头中加入Last-Modified。字段,用于表示资源的最新修改时间。浏览器第二次发送请求时,会将上次请求返回的Last-Modified时间添加到请求头的If-Modified-Since字段中。HTTP服务器收到时间后,会比较资源的修改时间。如果最新修改时间相同,则证明资源没有更新,然后响应304告诉客户端直接使用浏览器的资源副本。如果最新修改时间不一致,服务端会回复200,并发送一个新的资源给客户端。比对资源的唯一标识这种方法类似于比对资源的最新修改时间,主要是使用If-None-Match和ETag来完成:当客户端完成第一次请求时,服务端会在请求中添加Etag字段responseheader,用于表示资源的唯一标识。浏览器第二次发送请求时,会将上次请求返回的ETag标识添加到请求头的If-None-Match字段中。HTTP服务器收到标识符后,会比较资源的标识符。如果一致,则证明资源没有更新,然后响应304告诉客户端直接使用浏览器的资源副本。如果不是,则服务器响应200并向客户端发送新资源。下面是一张流程图,充分说明了浏览器发起HTTP请求时缓存机制的过程:有些文件在1秒内修改了多次,将无法准确标记文件的修改时间;如果有些文件是周期性生成的,有时内容没变,但是Last-Modified变了,导致文件无法使用Cache;可能会出现服务器没有准确获取文件修改时间,或者与代理服务器时间不一致的情况。Etag是服务器自动生成或开发者生成的相应资源在服务器端的唯一标识,因此可以更准确地控制缓存。最后,虽然浏览器缓存对用户体验有很大好处,但是作为开发者,我们需要在开发过程中禁用这个“讨厌”的浏览器缓存。有一个禁用缓存,只需将其连接即可。挂上之后,浏览器会忽略文档过期验证和服务器重新验证的过程,直接向服务器请求最新的资源。