HTTP基础

来源:互联网 发布:js函数没有返回值 编辑:程序博客网 时间:2024/05/16 03:29

HTTP

概念

  • HTTP是TCP/IP的上层协议。
  • TCP负责确保从一个网络节点向另一个网络节点发送的文件能作为一个完整的文件到达目的地,尽管在具体传送过程中这个文件可能会分解为小块传输。IP是一个底层协议,负责把数据包沿路移动到目的地。
  • HTTP则是另一个网络协议,有一些Web特定的特性,不过它要依赖于TCP/IP从一处向另一处完整地传送请求和相应。HTTP会话的结构是一个简单的请求/响应序列:浏览器发出请求,服务器做出响应。

    HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:http://host[":"port][abs_path]http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。eg:1、输入:www.guet.edu.cn浏览器自动转换成:http://www.guet.edu.cn/2、http:192.168.0.116:8080/index.jsp

HTTP协议的主要特点:

  • 支持客户/服务器模式
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTO协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型有Content-Type加以标记。
  • 无连接:无连接的含义时限制每次连接只处理一个请求。服务器处理完客户端的请求,并受到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态:HTTP协议时无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要处理前面的信息,则它必须进行再一次传输,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP报文的组成

报文:请求报文和响应报文

请求报文

请求报文
从图中可以看出,请求报文包括请求行,请求首部和请求体:
- 请求行:用来说明要请求做些什么。请求行中包括的内容有:HTTP方法,资源在Web服务器上的路径,Web浏览器请求的协议版本。
- 请求首部:每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。在这里可以看到请求的信息是xml文件。
- 请求体:请求主体中包括了要发送给Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。

响应报文

这里写图片描述
响应报文包括响应起始行,响应首部,相应内容
* 响应起始行:Web服务器使用的协议版本,相应的HTTP状态码,状态码的响应文本。分别对应图中的HTTP/1.1、200、OK
* 响应首部:同请求首部,每个首部字段都包含一个名字和一个值,中间用冒号隔开。首部以一个空行结束,这和请求首部的结束是一样的。
* 响应体:体中可以包含HTML,或其他要显示的内容。

总结:总的流程来说:HTTP创建一个请求,请求的各种信息包含到请求报文传输到服务器,服务器接收到请求之后去寻找相应的页面,将页面的信息放入响应体,并生成一个HTTP响应发送到浏览器,让浏览器显示响应体中页面的信息。

HTTP定义的四种与服务器的常用交互方式:GET、POST、PUT、DELETE

幂等概念:

幂等是说,一个请求原封不动的发送N次和M次(N不等于M,N和M都大于1)服务器上资源的状态最终是一致的。比如发贴是非幂等的,重放10次发贴请求会创建10个帖子。但修改帖子内容是幂等的,一个修改请求重放无论多少次,帖子最终状态都是一致的。

GET

  • GET是最简单的HTTP方法,它的主要任务就是请求服务器获得一个资源并把资源发回来。这个资源可能时一个HTML页面、一个JPEG、一个PDF文档等。具体是什么资源没有关系,关键是GET就是要从服务器拿些东西回来。

  • GET请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连.如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。因此用GET发送的请求报文中没有请求体,而是将请求内容附加在URL之后一起发送出去。

  • 根据HTTP规范,GET主要用于信息获取,而且应该是安全的和幂等的。一般来说,GET仅仅是用来获取信息,就像数据库查询一样,不会修改、增加数据、不会影响资源的状态。

  • GET的不足之处:GET方式提交的数据时有限的,最多是1024字节。要是用GET发送数据,请求的数据会附加在URL之后,会被保存在浏览器中,假如你输入了帐号密码信息,那么这些信息就很容易被截取导致帐号密码泄漏问题。

POST

  • POST和GET不同的是,请求的数据大小没有限制,是以一个From表单的形式发送给服务器端的。
  • POST请求体不会紧跟在url之后,这样就不容易被截取,有一定的安全性。
  • 根据HTTP规范,POST表示可能修改变服务器上的资源的请求。比如说你发表一条评论并且让它显示在页面上应该用POST方式来实现, 这样子评论后站点的资源就发生了修改,或者说资源被修改了。
  • POST会修改数据,因此不是幂等的

DELETE

  • DELETE请求用于请求服务器删除所请求URI(统一资源标识符,Uniform Resource Identifier)所标识的资源。DELETE请求后指定资源会被删除,DELETE方法也是幂等的。
  • 之所以说DELETE是幂等的,是因为当你用DELETE进行一次操作之后,所标识的资源被删除,之后当你进行n次相同的操作后,由于这个资源已经被删除了,因此所得到的结果都是相同的。

PUT

  • PUT把消息本题中的消息发送到一个URL,跟POST类似,但也有区别
  • PUT是幂等的,因此当你使用请求PUT请求去增加或删除站点的资源时就不符合幂等的概念,因此这个时候要使用POST。
  • PUT与POST的主要区别就是:POST不是幂等的,因此当请求去修改资源的参数时,进行这次操作之后再进行相同的操作返回的结果都是一样的,所以可以使用PUT。然而当你想要增加站点的资源时,你每执行一次命令站点都会增加,即使时相同的,这也就是所说的重复加载问题,这个时候不是幂等的,因此要用POST。

总的来说,这四个操作就好比数据库的四个操作:
* GET –> SELECT
* POST –> INSERT
* PUT –> UPDATE
* DELETE –> DELETE