一、HTTP协议

http是一个简单的请求-响应协议,它通常运行在TCP之上,位于应用层。
它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式

二、HTTP请求方法的基本概念

2.1 OPTIONS

OPTIONS请求就是预检请求,可用于检测服务器允许的 http 方法。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法。(有些服务器可能只支持对一些特殊类型的对象使用特定的操作)

为什么会使用这种请求方法?

是由于跨域请求引起的,这是因为在跨域的情况下,在浏览器发起”复杂请求”时主动发起的。跨域共享标准规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。

关键字段:Access-Control-*

image-20221130200928810

2.2 PUT

PUT请求是向服务器端发送数据的,从而改变信息。put请求与post一样都会改变服务器的数据,但是put的侧重点在于对于数据的修改操作,但是post侧重于对于数据的增加。

2.3 DELETE

通过http请求删除指定的URL上的资源

通常返回三种状态:

  • 200 (OK) - 删除成功,同时返回已经删除的资源
  • 202 (Accepted) - 删除请求已经接受,但没有被立即执行(资源也许已经被转移到了待删除区域)
  • 204 (No Content) - 删除请求已经被执行,但是没有返回资源(也许是请求删除不存在的资源造成的)

2.4 TRACE

客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或其他一些应用程序。每个中间节点都可能会修改原始的 HTTP 请求。TRACE 方法允许客户端在 最终将请求发送给服务器时,看看它变成了什么样子。

当TRACE请求到达目的服务器时, 整条请求报文都会被封装在一条HTTP响应的主体中回送给发送端。

这种向服务端请求信息主要用于调试web服务器连接用

image-20221130202653256

2.5 GET

感觉用图会更形象一点,下面是查资料时看到的图片:

image-20221130203812098

2.6 POST

image-20221130203843097

2.7 HEAD

HEAD方法与 GET 方法类似,也是请求从服务器获取资源,服务器的处理机制也是一样的,但服务器不会返回请求的实体数据,只会传回响应头,也就是资源的“元信息”。
HEAD 方法可以看做是 GET 方法的一个“简化版”或者“轻量版”。因为它的响应头与 GET 完全相同,所以可以用在很多并不真正需要资源的场合,避免传输 body 数据的浪费。

例如:

​ 检查一个文件是否存在,使用HEAD请求就够了

三、GET请求和POST请求的区别

算是做一个记录吧

这里面我们可以参考一下w3c里面说的:

1.GET在浏览器回退时是无害的,而POST会再次提交请求。

2.GET产生的URL地址可以被Bookmark,而POST不可以。

3.GET请求会被浏览器主动cache,而POST不会,除非手动设置。

4.GET请求只能进行url编码,而POST支持多种编码方式。

5.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

6.GET请求在URL中传送的参数是有长度限制的,而POST么有。

7.对参数的数据类型,GET只接受ASCII字符,而POST没有限制。.

8.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

9.GET参数通过URL传递,POST放在Request body中。

四、GET请求的基本格式

直接上图

image-20221130210923677

1、请求行

  • 请求方式 GET
  • 请求的资源路径+请求参数
  • 请求的协议版本号 HTTP/2

2、请求头

key: value构成的键值对

而POST请求还会多一个请求体的部分,用来传递参数

五、POST 请求提交表单,上传文件的方法

1、使用postman工具

2、python

import requests

def uploadFile(url):
#    headers={'Content-Type':'multipart/form-data'}
#files={'对应表单的name':('保存的文件名','文件流',‘rb’,'文件的Content-Type')}
    files={'file':('a.jpg',open(r'dom.jpg','rb'),'image/jpeg')}

    print(requests.post(url,files=files).text)

url=''
uploadFile(url)

六、HTTP状态码

HTTP 定义了这些标准状态代码,可用于传达客户端请求的结果。状态码分为五类。

下面列举一下平时常见的状态码:

  • 200 OK : 表示请求成功。
  • 301 Moved Permanently : 请求资源的 URL 已永久更改。新 URL 由Location响应中的标头字段给出。除非另有说明,否则此响应是可缓存的。
  • 302 Found : 请求资源的 URL 已临时更改。新 URL 由Location响应中的字段给出。此响应仅在由Cache-Control或者Expires标头字段指示时才可缓存。
  • 304 Not Modified : 指示客户端响应没有被修改,因此客户端可以继续使用相同的缓存版本的响应。
  • 400 Bad Request : 由于语法不正确,服务器无法理解该请求。客户端不应该在没有修改的情况下重复请求。
  • 404 Not Found : 服务器找不到请求的资源。
  • 405 方法不允许 : 服务器知道请求 HTTP 方法,但已被禁用,不能用于该资源。
  • 500 内部服务器错误 : 服务器遇到了阻止它完成请求的意外情况

用计算机语言获取HTTP状态码的方法

1、python

requests.get("http://www.baidu.com").status_code

2、java

URL url = new URL("http://www.baidu.com");
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
System.out.println(uc.getResponseCode());

七、HTTP头信息

HTTP头信息主要包括 HTTP通用头、HTTP请求头、HTTP响应头、HTTP实体头四个部分组成

常见的HTTP通用头

通用头既可以在请求信息中出现也可以在响应信息中出现,其提供了与报文相关的基本信息

  • Via:追踪客户端与服务器之间的请求报文和响应报文的传输路径
  • Cache-Control : 请求和响应遵循的缓存机制
  • Trailer : 表明以chunked编码传输的报文实体数据尾部存在的字段
  • Transfer-Encoding:规定了传输报文实体数据采用的编码方法
  • Date:创建HTTP报文的时间,即信息发送时间
  • Connection:客户端和服务器指定与请求或响应连接有关的选项,例如是否需要持久连接

常见的HTTP请求头

请求头是从客户端向服务器发送请求报文时所用的字段。服务器根据请求的头信息,为客户端提供响应

  • Accept:指定客户端能够接收的内容类型
  • Host:指定请求的服务器的域名和端口号
  • Referer:先前网页的地址,当前请求网页紧随其后,即来路
  • If-Match:只有请求内容与实体相匹配才有效
  • If-None-Match:如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变
  • X-Requested-With :异步请求
  • Origin:指定请求的服务器名称,包括协议和域名

常见的HTTP响应头

响应头是从服务器端向客户端发送响应报文时所用的字段

  • Set-Cookie:设置Http Cookie
  • Content-Location:请求资源可替代的备用的另一地址
  • Server:指明服务器软件以及版本号

常见的HTTP实体头

请求报文和响应报文中经常包含一些实体数据,如浏览器采用POST提交的表单数据、服务器返回给浏览器的网页数据。实体头提供了大量的有关实体数据的信息,包括实体数据的类型、长度和压缩方法等

  • Allow:列出资源所支持的HTTP方法集合
  • Content-Type:实体数据的类型
  • Last-Modified:实体数据上次被修改的日期以及时间
  • Content-Encoding:告知客户端服务器对实体数据的编码方式

八、URL

基本概念

URL的英文全拼是(Uniform Resoure Locator),表达的意思是统一资源定位符,提供找到该资源的确切路径,通俗理解就是网络资源地址,也就是我们常说的网址

还有一个名词URI(Uniform Resource Identifier),统一资源标识符,可以唯一标识一个资源

例如:http://www.baidu.com/a.html?a=1

这个URL的组成:

  • 协议部分:http://、https://、ftp://
  • 域名部分(ip地址):www.baidu.com
  • 资源路径部分:/a.html
  • 查询参数部分:?a=1

URL编码格式

url编码就是一个字符ascii码的十六进制,还需要加上%

例如:/的十六进制是2f,加上%后就是%2f