(1)Http基础

一、Http协议:

Web客户端和服务器之间的绝大数会话都是使用Http协议完成。客户端向服务器发送一个Http请求(request),服务器得到请求后会返回给客户端一个Http响应(response)。Http是TCP/IP的上层协议,这里是对网络协议的简单解释:
1) TCP协议确保从一个网络节点向另一个网络节点发送的文件能作为一个完整的文件送达(传送过程中可能会分成小块)。
2) IP协议为一个底层协议,负责把数据包沿路移动到目的地。
3) Http为一个网络协议,依赖于TCP/IP,结构为一个请求/ 响应序列。请求流包括Http方法、URL、表单参数。响应流包 含状态码、内容类型(如HTML)和内容(HTML代码)。因此,HTML也是Http响应的一部分。

二、Http请求与Http方法:

1)常见请求
既然HTML为响应的一部分,那么请求里面是什么呢?其中最常用请求方法的为GET和POST:
(1)Http基础
GET:
GET是最简单的Http方法也是表单默认方法。他的主要任务就是要求服务器获得一个资源并把资源发过来。但是,GET仍然可以发送一点数据。GET中的数据长度会受到限制,而且参数会以K-V的方式使用?分隔追加在URL后面(百度搜一个东西看一看?),数据完全暴露在外。此外GET可以创建书签,POST不可以。
(1)Http基础
POST:
利用POST可以请求某些东西,于此同时向服务器发送一些表单数据(form)。其中form中的参数不会像GET一样暴露追加在URL中,POST会自带一个消息体,将参数封装保存在消息体中:
(1)Http基础
HEAD:得到GET返回结果的部首部分,没有体(见下方响应结构)。
PUT: 把体中的消息放在指定的URL资源上。
TRACE: 回送请求消息,这样客户可以看到另一端接受了什么。
**DELETE:**删除URL制定的资源

2)幂等与非幂等 (以下部分内容来自:https://www.cnblogs.com/duhuo/p/4245202.html)
幂等: 同一请求发送一次或N次,服务器没有副作用或副作用 ( 产生的影响,不是贬义词 ) 是一样的。

假设有一个从账户取钱的远程API(可以是HTTP的,也可以不是),我们暂时用类函数的方式记为:

bool withdraw(account_id, amount)

withdraw的语义是从account_id对应的账户中扣除amount数额的钱;如果扣除成功则返回true,账户余额减少amount;如果扣除失败则返回false,账户余额不变。

值得注意的是:和本地环境相比,我们不能轻易假设分布式环境的可靠性。

所以问题来了,一种典型的情况是withdraw请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了withdraw被调用两次,账户也被多扣了一次钱。

3)几个Http请求的幂等性
HTTP GET方法用于获取资源,不应有副作用,所以是幂等的。比如:GET 不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。

HTTP DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:DELETE ,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。

HTTP POST方法用于创建资源,所对应的URI并非创建的资源本身,而是去执行创建动作的操作者,有副作用,不满足幂等性。 比如:POST的语义是创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性。

HTTP PUT方法用于创建或更新操作,所对应的URL是要创建或更新的资源本身,有副作用,它应该满足幂等性。比如:PUT的语义是创建或更新ID为4231的帖子。对同一URL进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性。

注意GET是幂等的,但是doGet()可能是非幂等的!别的请求同理。

三、Http响应:

响应结构
Http响应包含一个首部(什么协议,是否成功)和一个体(HTML代码)。其中首部中包含一个叫做Content-Type的内容类型(MIME),他告诉浏览器数据是什么类型,这样浏览器才知道如何显示数据。
(1)Http基础

四、URL与端口

URL定位Web资源,其格式为:
(1)Http基础
由于Web服务器上会运行多个程序,并且不同的程序可能会使用不同的协议来运行,这时就需要端口来区分不同的服务。