(JavaEE-03)HTTP协议
博客专区 > _-Leon-_ 的博客 > 博客详情
(JavaEE-03)HTTP协议
_-Leon-_ 发表于4年前
(JavaEE-03)HTTP协议
  • 发表于 4年前
  • 阅读 263
  • 收藏 14
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: HTTP协议

#http协议 什么是http协议?客户端连上web服务器后,如果想获取web服务器中的某个web资源,就需要遵守一定的通讯格式,http协议就是用于定义客户端与服务器之间的通讯格式。

> * http是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义web浏览器与web服务器之间交换数据的过程。 > * 深入学习http协议是学好web开发的一个重要前提! > * http协议的版本:http/1.0、http/1.1

(使用telnet演示,ctrl+],让回显正常显示)

###http1.0与http1.1

在http1.0协议中,客户端与服务器建立连接后,只能获取一个web资源。 http1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个资源。(使用telnet演示) 如果页面上有对别的web资源的引用,那么客户端会多次请求服务器,例如,有三张图片,那么就会一共请求四次(CSS精灵,优化程序)。

#http请求 客户端连上服务器之后,向服务器请求某个web资源,称之为客户端向服务器发送了一个http请求。一个完整的http请求包括:

  • 一个请求行
  • 若干消息头
  • 实体内容

GET /aaa/1.html HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: en-us,zh-cn;q=0.8,zh;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DNT: 1 Connection: keep-alive If-Modified-Since: Fri, 13 Jun 2014 23:27:47 GMT If-None-Match: W/"268-1402702067708" Cache-Control: max-age=0

请求行:用于描述客户端的请求方式、请求资源的名称,以及使用HTTP协议版本号 消息头:用于描述客户端请求哪台主机,以及客户端的一些环境信息等 实体内容:在这次请求中所携带的数据(消息头与实体内容中有一个空行)

###请求行 请求行中的GET称为请求方式,请求方式有:

  • POST、GET、HEAD、OPTIONS、DELETE、PUT
  • 常用的有:GET、POST
  • 用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求。(直接在地址栏输入地址访问,点击超链接访问,表单访问)

POST和GET,都用于向服务器请求某个资源,这两种方式的区别主要表现在数据传递上:

  • 如果请求方式是GET,那么可以在请求的URL地址后面以 ? 的形式带上交给服务器的数据,多个数据之间用 & 分隔(GET /aaa/1.html?name=jack&pwd=123)
  • GET方式这种附带参数是有限制的,其数据容量不能超过1K(不安全)
  • 如果使用POST请求,则可以在请求的实体内容中(负载)向服务器发送数据,而且数量不限(安全)

###消息头 常用的消息头:

  • Accept : text/html,image/* 告诉服务器,客户端所支持的类型
  • Accept-Charset : ISO=8859-1 客户端采用的编码表
  • Accept-Encoding : gzip,compress 客户端所支持的数据压缩格式
  • Accept-Language : en-us,zh-cn 客户端的语言环境(国际化)
  • Host : www.xinsiku.com:80 客户端想访问的主机
  • If-Modified-Since: Fri, 13 Jun 2014 23:27:47 GMT 客户端对于资源的最后缓存时间
  • Referer : http://www.xinsiku.com/index.jsp 告知服务端,客户端是从哪个页面去访问服务器的(防盗链)
  • User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0 客户端的机器环境(使用的操作系统,浏览器,版本号等)
  • Cookie 给服务器带一些数据
  • Connection: close/keep-alive 告诉服务器,请求完之后,是保存连接还是关闭连接
  • Date : Fri, 13 Jun 2014 23:27:47 GMT 请求时间值

#http响应 一个http响应代表服务器向客户端返回的数据,它包括:

  • 一个状态行,用于描述服务器对请求的处理结果
  • 若干消息头,消息头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会返回的数据
  • 以及实体内容,服务器向客户端返回的数据(实体内容与消息头中间有一个空行)

HTTP/1.1 200 OK (304 Not Modified)
Server : Apache-Coyote/1.1 Etag : W/"268-1402702066000" Date : Sat, 14 Jun 2014 03:45:49 GMT Accept-Ranges : bytes Content-Length : 268 Content-Type : text/html Date : Sat, 14 Jun 2014 03:47:34 GMT Etag : W/"268-1402702066000" Last-Modified : Fri, 13 Jun 2014 23:27:46 GMT Server : Apache-Coyote/1.1

###状态行 格式:HTTP版本号 状态码 原因叙述<CRLF> 举例:HTTP/1.1 200 OK 状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类:

> 100~199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程(很少见) > 200~299 表示成功接收请求并已完成整个处理过程,常用200 > 300~399 为完成请求,客户需要进一步细化请求。例如:请求的资源已经移动一个新地址,常用302(让请求去找别的资源)、307和304(让客户端去拿缓存) > 400~499 客户端请求有错误,常用 404 > 500~599 服务器端出现错误,常用500

###响应头 http响应常用响应头:

  • Location: http://xinsiku/index.jsp 这个头通常和302一起使用,告诉客户端去找别的资源 (demo)
  • Server: apache tomcat 告诉浏览器服务器的类型
  • Content-Encoding: gzip 告诉浏览器数据的压缩格式(gzip,减少流量,提升性能)(demo)
  • Content-Length: 80 告诉浏览器返回数据的长度
  • Content-Language: zh-cn 语言环境
  • Content-Type: text/html; charset=GB2312 返回数据的类型和编码 (demo)
  • Last-Modified: Fri, 13 Jun 2014 23:27:46 GMT 数据的最后修改时间(跟缓存相关)
  • Refresh: 1;url=http://www.xinsiku.com 多长时间定时刷新(服务器通过这个头来控制浏览器行为)(demo)
  • Content-Disposition: attachment; filename=aaa.zip 用下载的方式打开返回的数据(提示用户下载)(demo)
  • Transfer-Encoding: chunked 告诉浏览器,数据是以块的方式传输的
  • Set-Cookie:SS=Q0=5Lb_nQ; path=/search 控制Cookie与Session相关(后面有专题讲)
  • ETag: W/"7777-1242234904000" 给网页生成一个编号(做缓存用,单位可以到毫秒级别,Modified相关的只能到秒级别,高性能网站才需要相关开发)
  • Expires: -1 做缓存相关设置(-1或0 不要缓存,也可以设置缓存时间,如:2014 08 09,该设置是基于此次返回数据的,对别的资源没有效果)
  • Cache-Control: no-cache 设置缓存
  • Pragma: no-cache 设置缓存(针对不同的浏览器开发商,对缓存的设置,这三个设置一起用)
  • Connection: close/Keep-Alive
  • Date: Fri, 13 Jun 2014 23:27:46 GMT

在实际开发中,我们是不需要编写这些复杂的头信息的,因为在JavaEE中已经封装了很多针对不同请求和响应的处理对象,直接调用相对应的API就可以了,但是只要清楚了响应头,我们也可以自己去编写一些响应程序,而且对于响应对象的理解也更加容易。

###Range头(断点续传)(demo)

  • HTTP请求头字段

>Range头指示服务器只传输一部分web资源。这个头可以用来实现断点续传功能。Renge字段可以通过三种格式设置传输的字节范围: >> Range : bytes=1000-200 (传输范围从1000到2000字节) >> Range : bytes=1000- (从1000个字节以后的所有内容) >> Range : bytes=1000 (传输最后1000个字节)

  • HTTP响应消息头字段

> Accept-Ranges: 表示知否支持Renge,如果支持,返回:Accept-Ranges: bytes,如果不支持,返回:Accept-Ranges: none > Content-Range : 返回的Web资源的字节范围,如:Content-Range : 1000-3000/5000(表示本次返回资源的1000到3000字节的数据,总共5000字节)

共有 人打赏支持
粉丝 11
博文 17
码字总数 34045
×
_-Leon-_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: