唤醒手腕 Golang 语言 HTTP 请求学习笔记(HTTP 基本理论、net/http 库)

HTTP 介绍

HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。用作客户端和服务器之间的请求。

客户端(浏览器)会向服务器提交HTTP请求;然后服务器向客户端返回响应。其中响应包含有关请求的状态信息,还可能包含请求的内容。

HTTP 是一种应用层协议,是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0

协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。

当我们访问一些网页时,是显示通过 HTTPS 来进行通信的,并且当下大多数的网页都是通过 HTTPS 来进行通信的,因为 HTTPS 在 HTTP 的基础上做了一个加密的工作。

HTTP/1.1 协议中共定义了 8 种方法,来表明 Request-URL 指定的资源不同的操作方式

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD 方法

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

HTTP 协议工作过程

当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个 HTTP 请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个 HTTP 响应。并且当我们访问一个网站时,可能涉及不止一次的 HTTP 请求和响应的交互过程。

客户端 Client: 主动发起网络请求的一端

服务器 Server: 被动接收网络请求的一端

请求 Request: 客户端给服务器发送的数据

响应 Response: 服务器给客户端返回的数据

URL 基本介绍

平时我们俗称的”网址“,其实就是 URL(Uniform Resource Locator),翻译为统一资源定位符。

URL 的标准格式如下:

协议类型:[//服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]

URL 的完整格式如下:

协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]

GET、POST 方法区别

两者没有本质区别,使用GET的场景,完全可以使用 POST 替代,使用POST的场景也同样可以使用 GET 替代。

扫描二维码关注公众号,回复: 14827265 查看本文章
语义不同:GET 习惯上用于从服务器上获取数据,POST是向服务器传送数据。

格式不同:由于body一般是空的,所以GET习惯上通过 query string 来传输数据;而 POST 方法的 query string 一般为空,所以 POST 习惯上使用 body 来传递数据。

幂等性。一般情况下,程序员会把GET请求的处理实现成幂等,而POST请求的处理,不要求实现幂等。

幂等 (idempotence)

幂等的数学概念:幂等是源于一种数学概念。

幂等性函数数学定义

如果在一元运算中, x x x 为某集合中的任意数,如果满足 f ( x ) = f ( f ( x ) ) f(x) = f(f(x)) f(x)=f(f(x)) ,那么该 f f f 运算具有幂等性,比如绝对值运算 a b s ( a ) = a b s ( a b s ( a ) ) abs(a) = abs(abs(a)) abs(a)=abs(abs(a)) 就是幂等性函数。

如果在二元运算中, x x x 为某集合中的任意数,如果满足 f ( x , x ) = x f(x,x) = x f(x,x)=x,前提是 f 运算的两个参数均为 x x x,那么我们称 f f f 运算也有幂等性,比如求大值函数 m a x ( x , x ) = x max(x, x) = x max(x,x)=x 就是幂等性函数。

幂等性在开发中的概念

在数学中幂等的概念或许比较抽象,但是在开发中幂等性是极为重要的。简单来说,对于同一个系统,在同样条件下,一次请求和重复多次请求对资源的影响是一致的,就称该操作为幂等的。比如说如果有一个接口是幂等的,当传入相同条件时,其效果必须是相同的。

特别是对于现在分布式系统下的 RPC 或者 Restful 接口互相调用的情况下,很容易出现由于网络错误等等各种原因导致调用的时候出现异常而需要重试,这时候就必须保证接口的幂等性,否则重试的结果将与第一次调用的结果不同,如果有个接口的调用链 A->B->C->D->E,在 D->E 这一步发生异常重试后返回了错误的结果,A,B,C 也会受到影响,这将会是灾难性的。

在生活中常见的一些要求幂等性的例子:

案例一:博客系统同一个用户对同一个文章点赞,即使这人单身30年手速疯狂按点赞,那么实际上也只能给这个文章 +1 赞。

案例二:在微信支付的时候,一笔订单应当只能扣一次钱,那么无论是网络问题或者 bug 等而重新付款,都只应该扣一次钱。

幂等性与并发安全

幂等性是系统接口对外的一种承诺,而不是实现,承诺多次相同的操作的结果都会是一样的。而并发安全问题是当多个线程同时对同一个资源操作时,由于操作顺序等原因导致结果不正确。

这两个实际上是完全独立的两个问题,比如说同一笔订单即使你不停的提交支付,如果扣除了多次钱,就说明该操作不幂等。而有多笔订单同时进行支付,最后扣除金额不是这多笔金额的总和,那么说明该操作有并发安全问题。所以幂等性和并发安全是完全两个维度的问题,要分开讨论解决。

猜你喜欢

转载自blog.csdn.net/qq_47452807/article/details/129540705
今日推荐