工作中涉及到了http相关的知识,因此想学习一下,不求精通,只求掌握基本的http相关的知识并在工作中运用。
工作中哪些地方用到了http相关的知识:

  1. 产品接口是restful API,使用时需要构造http请求,包括使用curl调用restful api;
  2. 测试时或者遇到bug时,需要根据返回码和返回的消息体定位问题,需要http相关知识;
  3. 产品的不同微服务间通信也是用的restful api;
  4. 单纯想学习一下;

    1、client端和server端模型

    端系统间的通信方式有两大类:客户(client)- 服务器(server)方式和对等方式(P2P),互联网中最常用的是client-server模式。
    client和server都是运行在两个不同主机上的进程。client运行的主机一般叫客户机,server运行的主机叫服务器。client端构造好http请求后,通过域名-IP地址解析,将请求发送到对应的服务端,服务端处理完请求后,把处理结果返回给client端,如图所示:
    http概述 - 图1
    可以看到client和server端都是在传输信息,传输信息时要遵循统一的协议,这个协议可以采用http协议。
    Tips:

  5. 域名-IP地址的解析,可以在本地hosts文件里配置,也可以通过DNS服务器将要访问的域名解析成IP地址,最终访问服务器时都是以IP地址访问的。

  6. 客户端和服务端可以是同一个节点(主机),比如你想在服务端上验证该节点的api功能,可以就在服务端节点上用curl工具构建请求api并发往本节点服务器端,此时构造的http请求里可以直接用127.0.0.1代替服务端域名。
  7. 客户端必须知道服务端的地址,服务端不需要知道客户端的地址。

    2、http报文组成

    http协议全称是HyperTest Transfer Protocol,超文本传输协议。
    http报文说白了就是client和server通信时依据http协议,将传输的信息以文本的形式呈现,这个文本就是http报文。http报文分为请求报文和消息报文,这两类报文有着相同的结构组成,如图:
    http概述 - 图2
    网上有很多如何在浏览器上查看http报文的,我这里举个例子,方便理解。
    http请求报文:
    http概述 - 图3
    http响应报文:
    http概述 - 图4
    图中没有显示空行和报文主体。
    下面大致讲一下这四部分:
    请求行/响应行
    请求行由http动词,请求uri和http版本组成,主要是反应这次请求要对什么资源做什么操作
    响应行由http返回码,原因短语和http版本组成,呈现的服务端对这次请求的处理结果,我们通过响应行的信息能知道这次请求是否成功,bug出在client端还是server端,原因是什么。
    首部字段
    首部字段又叫头域(header),相当于http报文的元数据,记录了这次http报文的具体描述信息,比如时间、服务端域名等。
    空行
    用来区分首部字段和报文主体。
    报文主体
    报文主体并不是每个报文都有的,要看具体的报文是要做什么,比如列举桶的返回报文里,报文主体会把桶列表以xml格式返回,但是列举桶的请求报文主体什么都不包含。报文主体返回的格式一般是xml或者json格式。

    3、URI和URL的区别和联系

    URI: Uniform Resource Identifier,统一资源标识符,用来唯一标识互联网中的一份资源。
    URL: Uniform Resource Locator,统一资源定位符,我们访问网站的网址就是URL。
    URL是URI的子集。
    URI的目的就是唯一标识互联网中的一份资源,具体可以用资源名称、资源地址等,但是资源地址是目前使用最广泛的,因此URL就容易和URI混淆。URI相当于抽象类,URL就是这个抽象类的具体实现类。

    4、http动词

    http动词用来描述client端想对server端的资源进行何种操作,常见的http动词如下:

    1. GET: 从服务器获取资源
    2. POST: 在服务器新建资源
    3. PUT: 在服务器更新资源
    4. DELETE: 在服务器删除资源
    5. HEAD: 获取资源的元数据
    6. OPTIONAL: 查询对指定的资源支持的方法

    工作中经常遇到的也就是GET PUT和DELETE,需要注意restful api里的http动词可能会与原生的http动词含义上有略微区别。

    5、http返回码

    http返回码是在返回报文中,server端处理client端发过来的请求时,会将处理的结果以http返回码的形式呈现,通过返回码我们可以知道这次请求是否成功,失败的话是client端出了问题还是server端出了问题,问题大概是什么。通过分为四类,但是工作中3**
    重定向。
    2**
    处理请求成功。
    3**
    重定向。
    4**
    处理请求失败,问题出在client端,可能是发起请求的一方没有权限、API格式不正确等原因。
    5**
    处理请求失败,问题出在server端,一般就是后台程序哪里写的有bug,要检查我们的服务端代码。

    6、http和https

    https并非是一种新协议,是身披SSL的http协议,只是http通信接口部分用SSL和TLS协议代替而已。一般涉及隐私的,比如账号等都是https,我们现在访问网站基本都是https。
    一句话概括:
    https = http + 加密 + 认证 + 完整性保护
    http协议的缺点

  8. 通信使用明文,内容可能被窃听。

  9. 通信双方的身份无法得到认证,身份可能遭遇伪装。
  10. 无法验证报文的完整性。

针对以上问题,https的改进措施

  1. 加密。https协议通过SSL或者TLS协议将报文内容进行加密,client端进行加密,server端进行解密。
  2. 认证。通过值得信赖的第三方机构颁布证书,即可确认通信双方的身份。客户端持有证书即可完成客户端身份的确认,客户端通信前会查看服务端的证书。
  3. 完整性保护。可以通过MD5等散列码进行通信内容的校验。

    7、工程中如何使用http协议通信

    我不是搞java web的,只是在看公司测试用例和看官网的api、sdk时对这部分有一些感受。
    一般会new一个httpclient,把报文消息(body)和头域(header)组装好,再构成一个http request,调用httpclient的发送请求方法,进行通信。
    公司将服务封装在restful api里,用户想调用restful api接口,有两种方法;
    1、自己将api进行封装,封装成需要的sdk。
    2、使用公司提供的sdk,一般会提供多种语言版本的sdk,供不同开发语言的使用者使用。