现在的位置: 首页 > 综合 > 正文

黑马程序员-HTTP协议的请求和响应信息

2013年10月15日 ⁄ 综合 ⁄ 共 3072字 ⁄ 字号 评论关闭
----------------------------------客户端-------------------------------------
http协议的客户端请求内容包括:请求行、消息头、内容,eg:GET /a.html HTTP/1.1

请求行:用于描述客户端的请求方式、请求的资源名称以及使用的http协议的版本号

消息头:

Accept:用于告诉服务器,客户机支持的数据类型
Accept-Charset:用于告诉服务器,客户机采用的编码
Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式
Accept-Language:客户机的语言环境
Host:客户机通过这个头告诉服务器,想访问的主机名
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间
Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境
Cookie:客户机通过这个头可以向服务器带数据
Range:指示服务器只传输一部分Web资源。这个头可以用来实现断点续传功能。Range字段可以通过三种格式设置要传输的
      字段范围:
      Range:bytes=1000-2000,表示传输范围从1000到2000字节。
      Range:bytes=1000-,表示传输Web资源中第1000个字节以后的所有内容。
      Range:bytes=1000,传输最后1000个字节。
      eg:
      /*
假设一个用户将一个文件下载了四个字符了,现在要接着上次没下载完的地方下载,编写客户端程序,从上次那个文件的第五个字符开始下载,
下载完毕后写入到D:\a.txt里面去,而且是接着a.txt上次的地方往下写,不是重新生成文件,代码如下:
        
  URL url =  new URL("http://ip:port/projectname/a.txt");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestProperty("range", "bytes=4-");
InputStream is = con.getInputStream();
FileOutputStream fos = new FileOutputStream("D:\\a.txt",true);
byte[] buf = new byte[1024];
int len = 0;
while((len=is.read(buf))>0){
fos.write(buf, 0, len);
}
       */

内容:一般post表单提交方式的话会把所有的内容放在这里面

--------------------------------------服务端------------------------------------------

http协议的服务端包括:状态行、响应头和内容,以下一一详细解释

状态行:用于描述服务器对请求的处理结果,eg:HTTP/1.1 200 OK
状态行常见的一些状态码:

100~199:表示成功接收请求,要求客户端继续提交下一个请求,才能完成整个处理过程
200~299:表示成功接收请求,并已完成整个处理过程,常用200
300~399:为完成请求,需要客户进一步细化需求。例如,请求的资源已经移动到一个新地址,常用302,307和304
        >302表示要客户端去找别的地址,服务器会回送一个location给客户端,客户端会去找这个location,这个其实就是serlvet里面的重定向
        >307和304表示要客户端去找缓存里面的数据
400~499:客户端的请求有错误,常用404
500~599:服务器端出现错误,常用500

响应头:
Location:这个头配合302状态吗使用,用于告诉客户找谁
      eg:response.setStatus(302);
         response.setHeader("location","页面地址");
Server:apache tomcat
       服务器通过这个头,告诉浏览器服务器的类型
Content-Encoding:gzip
       服务器通过这个头,告诉浏览器数据的压缩格式,一般都用gzip的压缩格式,Java提供了               GZIPInputStream类和GZIPOutputStream类以供压缩数据
Content-Length:服务器通过这个头,告诉浏览器回送数据的字节长度
Content-Type:text/html; chartset=GB2312
       服务器通过这个头,告诉浏览器回送数据的类型
Last-Modified:Tue,11 Jul 2000 18:23:51 GMT
       服务器通过这个头,告诉浏览器当前资源缓存时间  
Refresh:服务器通过这个头,告诉浏览器隔多长时间刷新一次,该属性经常用在股票页面和聊天室
    eg1:response.setHeader("refresh","3");  //3代表服务器告诉浏览器,每隔三秒钟刷新一次数据
    eg2:response.setHeader("refresh","3;url='http://www.sina.com'");//每隔三秒刷新到新浪上去
Content-Disposition:服务器通过这个头,告诉浏览器以下载方式打开数据
    eg:response.setHeader("Content-Disposition", "attachment;filename=下载时显示的文件名称");
    /*
    InputStream is = this.getServletContext().getResourceAsStream("/yct_3.gif");
byte[] buf = new byte[1024];
int len = 0;
OutputStream os = response.getOutputStream();
while((len=is.read(buf))>0){
os.write(buf,0,len);
}
     */
Transfer-Encoding:chunked
       服务器通过这个头告诉浏览器数据的传送格式,chunked代表一块块的传送
Set-Cookie:SS=QQ=5Lb_nQ; path=/search
       设置cookie信息
ETag:缓存相关的头,相对于Last-Modified它能够做到实时更新
Expires:也是缓存相关的头,服务器通过它告诉浏览器,把回送的资源缓存多长时间,-1或0,则不缓存
Cache-Control:no-cache
Pragma:no-cache
服务器通过以上两个头,也是控制浏览器不要缓存数据,控制浏览器不要缓存数据的属性之所以这么多,是
因为每个浏览器对数据的解析不一样,要想兼容性好一点,兼容的浏览器多一点,尽量都设置
Connection:close/Kep-Alive   告诉浏览器,响应完了是保存连接还是断开连接
Date:Tue, 11 Jul 2000 18:23:51 GMT 当前时间
Accept-Ranges:这个字段说明Web服务器是否支持Range属性,支持则返回Accept-Ranges:bytes,不支持
      则返回Accept-Ranges:none.
Content-Range:指定了返回的Web资源的字节范围,这个字段值的格式是:eg. Content-Range:1000-3000/5000
      这句话的意思是我的资源一共有5000个字节,我向你返回1000-3000的字节范围

内容:一般是服务器返回给客户端的内容

抱歉!评论已关闭.