唤醒手腕 Golang 语言基于 HTTP 请求手撸简单 WEB 框架详细教程(更新中)

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: 服务器给客户端返回的数据

客户端和服务器 http 会话请求过程
在这里插入图片描述

URL 基本介绍

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

URL 的标准格式如下:

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

URL 的完整格式如下:

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

GET POST 方法区别

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

语义不同: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 等而重新付款,都只应该扣一次钱。

幂等性与并发安全

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唤醒手腕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值