四、http请求、响应详情

一、http请求详情

(一)http请求概述

  1. 客户端连上服务器后,向服务器请求某个web资源,称之为客户端像服务器发送了一个http请求。
  2. 一个完整的http请求包括如下内容:
    一个请求行、若干消息头以及实体内容,其中一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。格式如下:
    这里写图片描述

(二)http请求细节——请求行

请求行
  1. 格式:请求方式 资源路径 HTTP版本号
  2. 举例:GET /mail/1.html HTTP/1.1
  3. 请求方式:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
  4. 用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如果想把请求方式改为Post,可以通过改变表单的提交方式实现。
  5. 不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上。
GET方式
  1. 如请求方式为get方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔。例如:
  2. GET /mail/1.html?name=abc&password=xyz HTTP/1.1
  3. GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量不能超过1K。
POST方式
  • 如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。

(三)http请求细节——请求头详解

1、请求头字段用于客户端在请求消息中向服务器传递附加信息,主要包括客户端可以接受的数据类型、压缩方法、语言以及发出请求的超链接所属页面的URL地址等信息。
2、常用请求头

请求头举例含义
Accepttext/html, application/xhtml+xml, */*浏览器可接受的MIME类型
Accept-Charset用于告诉服务器,客户机采用的编码
Accept-Encodinggzip, deflate用于告诉服务器,客户机支持的数据压缩格式,比如gzip
Accept-Languagezh-CN浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。 可以在浏览器中进行设置。
Hostlocalhost:8080初始URL中的主机和端口,如果没有匹配的主机则访问默认主机。
Refererhttp://localhost:8080/mail/客户机通过这个头来告诉服务器,它是从哪个资源来访问服务器的(防盗链)
Content-Typeapplication/x-www-form-urlencoded内容类型
If-Modified-SinceSun, 22 Jan 2017 08:12:40 GMT只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
If-None-MatchW/”140-1485072760884”当服务器端资源的标识与请求给定标识不同时,标识服务器端资源发生改变,返回最新资源,否则表示资源未发生改变从客户机缓存取资源。
User-Agent浏览器类型.
Content-Length9表示请求消息正文的长度
ConnectionKeep-Alive表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接)
Cookie这是最重要的请求头信息之一,客户端通过该请求头向服务器发送一点数据
DateMon, 22 Aug 2011 01:55:39 GMT请求时间GMT

(四)实验

IE浏览器+HttpWatch Professional插件,可以很方便的抓包观察http请求。下面实验就是用的这个方式。

1、观察GET请求
<form action="/1.html" method="get">
   <input name="username" type="text"/>
   <input type="submit" value="submit"/>
</form>

这里写图片描述
这里写图片描述

2、观察post请求
<form action="/1.html" method="post">   
   <input name="username" type="text"/>
   <input type="submit" value="submit"/>
</form>

这里写图片描述
这里写图片描述

二、http响应详情

(一)http响应概述

一个http响应代表服务器向客户端回送的数据,它包括
一个状态行、若干消息头、一个空行、实体内容,其中一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。格式如下:
这里写图片描述

(二)http响应细节——状态行

状态行
  1. 格式:HTTP版本号 状态码 原因叙述
  2. 举例:HTTP/1.1 200 OK
状态码

状态码用于表示服务器对请求的各种不同处理结果和状态,它是一个三位的十进制数。响应状态码分为五类,使用最高位为1到5来进行分类,如下所示:

状态码含义
100-199表示成功接收请求,要求客户端提交下一次请求才能完成整个处理过程
200-299表示成功接收请求并已完成整个过程,常用200
300-399重定向或者资源位置发生改变。例如302重定向,304未修改从缓存取,307临时重定向,301永久移动
400-499客户端的请求错误,常用404(未找到)、403(拒绝)
500-599服务器端出现错误,常用500(服务器内部错误)
常用状态码
状态码详情
200(正常)表示一切正常,返回的是正常请求结果。
302/307(临时重定向)指出被请求的文档已被移动到别处,此文档的新的URL在location响应头中给出。
304(未修改)表示客户机缓存的版本是最新的,客户机可以继续使用它,无需到服务器请求。客户机通过If-Modified-Since请求头通知服务器缓存版本。
404(找不到)服务器上不存在客户机所请求的资源
500(服务器内部错误)服务器端的程序发生错误

(二)http响应细节——响应头详解

响应头举例含义
Locationhttp://www.it315.org/index.jsp配合302状态码使用,指示新的资源的位置
Serverapache tomcat指示服务器的类型
Content-Encodinggzip服务器发送的数据采用的压缩类型
Content-length80告诉浏览器正文的长度
Content-Typetext/html; charset=GB2312服务器发送的内容的MIME类型
Content-Languagezh-cn服务器发送的文本的语言
Last-ModifiedTue, 11 Jul 2000 18:23:51 GMT资源的最后修改时间
Refresh1;url=http://www.it315.org指示客户端刷新频率。单位是秒。
Content-Dispositionattachment; filename=aaa.zip指示客户端下载文件
Transfer-Encoding通知浏览器数据的传送格式
Set-CookieSS=Q0=5Lb_nQ; path=/search服务器端发送的cookie
ETagW/”140-1485072760884”资源的标识,如果资源更改,Etag也更改。客户端第一次请求资源时,服务器回送该响应头,客户端再次请求资源时带上该头,服务器通过比较Etag判定客户端缓存资源是否为最新。能做到实时,其他的头只能做到秒级别。
Expires-1通知客户机把回送的资源缓存多长时间,-1和0表示不缓存
Cache-Controlno-cache控制是否缓存资源
Pragmano-cache控制是否缓存资源
Connectionclose响应完毕是否立刻关闭连接,close表示立刻关闭,keep-alive表示不关闭
DateTue, 11 Jul 2000 18:23:51 GMT响应时间

三、缓存和断点续传

(一)缓存相关消息头:

消息头类别含义
If-Modified-Since请求头通知服务器客户端缓存资源的时间,只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
Last-Modified响应头资源的最后修改时间
If-None-Match请求头上一次请求该资源服务器回送Etag响应头的内容。如果服务器端的资源改变了则返回最新资源,否则客户机从缓存取资源。
Etag响应头/请求头资源的标识
Expires响应头通知客户机把回送的资源缓存多长时间,-1和0表示不缓存
Cache-Control响应头通知客户端是否需要缓存该资源。
Pragma响应头通知客户单是否需要缓存该资源。

(二)断点续传消息头:

消息头类别含义
Range请求头Range头指示服务器只传输一部分web资源,Range头字段可以通过三种格式设置要传输的字节范围(资源从0字节开始算起):
bytes=1000-2000:传输范围从1000到2000字节。
bytes=1000-:传输Web资源中第1000个字节及其以后的所有内容。
bytes=1000:传输最后1000个字节
Accept-Ranges响应头说明服务器是否支持Range,以及支持的Range单位。
bytes:支持Range且单位为字节
none:不支持Range。
Content-Range响应头指定了返回的web资源的字节范围,例子:
1000-3000/5000:表示返回Web资源的第1000到3000个字节的内容,该资源总长度为5000字节。

四、小实验

1、重定向

response.setStatus(302);
// "/"代表从主机开始,不加"/"表示从当前web应用开始
response.setHeader("Location", "index.html");

2、数据压缩(content-encoding,content-length)

String data="12345 54321 上山打老虎";

ByteArrayOutputStream bOut=new ByteArrayOutputStream();
GZIPOutputStream gzipOut=new GZIPOutputStream(bOut);
gzipOut.write(data.getBytes());
gzipOut.close();

byte[] gzip=bOut.toByteArray();
response.setHeader("Content-Encoding", "gzip");
response.setHeader("content-length", gzip.length+"");
response.getOutputStream().write(gzip);

3、显示图片(content-type),tomcat的web.xml可以查到文件类型的写法

response.setHeader("content-type", "image/jpeg");
InputStream in=this.getServletContext().getResourceAsStream("/1.jpg");
OutputStream out=response.getOutputStream();
byte buf[]=new byte[1024];
int len=0;
while((len=in.read(buf))>0){
    out.write(buf,0,len);
}

4、定时刷新页面(refresh)

response.setHeader("refresh", "3;url=index.html");
response.getWriter().write("aaaa");

5、下载文件(content-disposition),实验表明必须先设置响应头再写数据

response.setHeader("content-disposition", "attachment;filename=1.jpg");
InputStream in=this.getServletContext().getResourceAsStream("/1.jpg");
OutputStream out=response.getOutputStream();
byte buf[]=new byte[1024];
int len=0;
while((len=in.read(buf))>0){
    out.write(buf,0,len);
}

6、断点续传(range)

URL url=new URL("http://localhost:8080/WebDemo1/abc.txt");
HttpURLConnection connection=(HttpURLConnection) url.openConnection();
connection.addRequestProperty("Range", "bytes=6-");
InputStream in=connection.getInputStream();
FileOutputStream out=new FileOutputStream("D:\\abc.txt", true);
byte[] buf=new byte[1024];
int len=0;
while ((len=in.read(buf))>0) {
      out.write(buf, 0, len);
}
in.close();
out.close();
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ni0224

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值