工作中涉及到了http相关的知识,因此想学习一下,不求精通,只求掌握基本的http相关的知识并在工作中运用。
工作中哪些地方用到了http相关的知识:
- 产品接口是restful API,使用时需要构造http请求,包括使用curl调用restful api;
- 测试时或者遇到bug时,需要根据返回码和返回的消息体定位问题,需要http相关知识;
- 产品的不同微服务间通信也是用的restful api;
-
1、client端和server端模型
端系统间的通信方式有两大类:客户(client)- 服务器(server)方式和对等方式(P2P),互联网中最常用的是client-server模式。
client和server都是运行在两个不同主机上的进程。client运行的主机一般叫客户机,server运行的主机叫服务器。client端构造好http请求后,通过域名-IP地址解析,将请求发送到对应的服务端,服务端处理完请求后,把处理结果返回给client端,如图所示:
可以看到client和server端都是在传输信息,传输信息时要遵循统一的协议,这个协议可以采用http协议。
Tips: 域名-IP地址的解析,可以在本地hosts文件里配置,也可以通过DNS服务器将要访问的域名解析成IP地址,最终访问服务器时都是以IP地址访问的。
- 客户端和服务端可以是同一个节点(主机),比如你想在服务端上验证该节点的api功能,可以就在服务端节点上用curl工具构建请求api并发往本节点服务器端,此时构造的http请求里可以直接用127.0.0.1代替服务端域名。
-
2、http报文组成
http协议全称是HyperTest Transfer Protocol,超文本传输协议。
http报文说白了就是client和server通信时依据http协议,将传输的信息以文本的形式呈现,这个文本就是http报文。http报文分为请求报文和消息报文,这两类报文有着相同的结构组成,如图:
网上有很多如何在浏览器上查看http报文的,我这里举个例子,方便理解。
http请求报文:
http响应报文:
图中没有显示空行和报文主体。
下面大致讲一下这四部分:
请求行/响应行
请求行由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动词如下:
GET: 从服务器获取资源POST: 在服务器新建资源PUT: 在服务器更新资源DELETE: 在服务器删除资源HEAD: 获取资源的元数据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协议的缺点 通信使用明文,内容可能被窃听。
- 通信双方的身份无法得到认证,身份可能遭遇伪装。
- 无法验证报文的完整性。
针对以上问题,https的改进措施
- 加密。https协议通过SSL或者TLS协议将报文内容进行加密,client端进行加密,server端进行解密。
- 认证。通过值得信赖的第三方机构颁布证书,即可确认通信双方的身份。客户端持有证书即可完成客户端身份的确认,客户端通信前会查看服务端的证书。
- 完整性保护。可以通过MD5等散列码进行通信内容的校验。
7、工程中如何使用http协议通信
我不是搞java web的,只是在看公司测试用例和看官网的api、sdk时对这部分有一些感受。
一般会new一个httpclient,把报文消息(body)和头域(header)组装好,再构成一个http request,调用httpclient的发送请求方法,进行通信。
公司将服务封装在restful api里,用户想调用restful api接口,有两种方法;
1、自己将api进行封装,封装成需要的sdk。
2、使用公司提供的sdk,一般会提供多种语言版本的sdk,供不同开发语言的使用者使用。
