首页 > 代码库 > HTTP1.1协议在再体验

HTTP1.1协议在再体验

 1、HTTP请求  

* 分类:请求行、请求头、请求体  

* 请求行:描述请求的资源  

  * 格式:请求方法  资源路径  协议  

  * 例如:GET /day01/1.html HTTP/1.1  

  * 请求方法    

  * GET:请求内容追加在URL之后   

      * URL的长度有限制1k   

    * POST:请求内容放置在请求体中  

* 请求头   

  * Accept:浏览器通知服务器,浏览器可以接受的数据类型   

  * Accept-charset:浏览器通知服务器,浏览器支持的字符集   

  * Accept-Encoding:浏览器通知服务器,浏览器支持的压缩格式  (这个压缩后能够减少流量、比较有用)

  * Accept-Language:浏览器通知服务器,浏览器支持的语言环境  

  * Host:浏览器通知服务器,浏览器访问的服务器的主机名   

  * If-Modified-since:浏览器询问服务器,浏览器本地是否修改过  

  * Referer:浏览器通知服务器,浏览器当前页来自哪个页面   * 防盗链   

  * user-agent:浏览器通知服务器,浏览器端的基本信息   

  * cookie:  

  * connection:浏览器保持服务器,是否保持连接状态  

  * Date:浏览器通知服务器,浏览器端的时间  

* 请求体

  * 请求体与请求头之间存在一个空行    

 2、HTTP响应  

* 分类:响应行 响应头 响应体  

* 响应行:协议 状态码 状态信息   

* 例如:HTTP1.1 200 ok  

* 状态码:服务器通知浏览器的行为,执行过程  

* 1xx:服务器通知浏览器,服务器还没有处理完成    

* 2xx: 服务器通知浏览器,服务器已经处理完成     

* 200:处理完成  

* 3xx: 服务器通知浏览器,服务器还需要浏览器进一步处理来完成整个操作

       * 302:服务器通知浏览器需要进一步操作,从http相应头获(location)得进一步操作的资源  (即重定向)

     * 304:服务器通知浏览器当前资源没有修改,从缓存中获取    

* 4xx:服务器通知浏览器,浏览器发送数据有误  

     * 401:没有权限     

   * 404:找不到资源  

* 5xx:服务器通知浏览器,服务器出现异常    

   * 500:服务器异常    

   * 503:服务器未响应  * 响应头  

* 响应体:服务器响应浏览器所有的内容   

* 注意:响应头与响应体之间存在一个空行  

3、注意  *在地址栏回车会找缓存文件  

     *如果点刷新是重新请求

4、案例  假设一个页面里面有  

<img src="http://www.mamicode.com/1.jpg"/>  

<img src="http://www.mamicode.com/2.jpg"/>

 <img src="http://www.mamicode.com/3.jpg"/>

 <img src="http://www.mamicode.com/1.jpg"/>

 试问它向服务器发送了几次请求?

请求过程:首先向服务请求、如果服务器有这个资源(图片、或者.html、或者.jsp或者servlet)就会返回给浏览器下载到本地   

      第二次请求的时候会再本地查找是否存在资源如果有这个资源就不会再向服务请发送这个请求、所以是3次请求。    

  private void cjq_refresh(HttpServletResponse response) throws IOException{   

  //refresh:服务器通知浏览器、刷新的时间以及url 单位:秒   

  if(num>0){    

     //将内如输入   

      response.getWriter().write(num--);  

      response.setHeader("refresh", "1");  

   }else{  

      response.setHeader("refresh","0,url=http://localhost/day01/1.html");   

  }  

}

 private void cjq_encoding(HttpServletResponse response) throws IOException {  

   //通知浏览器,服务器发送的数据时压缩的,并且指定压缩的格式  

   response.setHeader("content-encoding", "gzip");     

   //将大数据压缩后,发送给浏览器  

   //准备大数据  

   StringBuilder builder = new StringBuilder();   

  for(int i = 0 ; i < 80000 ; i ++){   

     builder.append("cjqq");  

   }   

  String data = http://www.mamicode.com/builder.toString();

  //确定压缩的位置

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

   //压缩  gzip   

   GZIPOutputStream gzip = new GZIPOutputStream(baos); 

  //压缩的位置   

  //压缩数据

   gzip.write(data.getBytes());  

   gzip.close();     

  //获得压缩后的字节数组

   byte[] endData = http://www.mamicode.com/baos.toByteArray();

    //将压缩的数据发送给浏览器  --  

   response.getOutputStream().write(endData);  

 }

 private void cjq_type(HttpServletResponse response) throws IOException {

    //content-type:服务器通知浏览器,服务器发送的数据的编码  

   response.setHeader("content-type", "text/html;charset=UTF-8");

    //与上面等效  

   //response.setContentType("text/html;charset=UTF-8");

    response.getWriter().write("呵呵");  

}

 private void cjq_sendRedirect(HttpServletResponse response) {   

   //跳转 (重定向) -- 服务器通知浏览

    //设置http响应头

    response.setHeader("location", "http://localhost/day01/1.html");//端口默认为80

    //状态码确定行为   response.setStatus(302);     

   //与上面两句话是等效的、都是重定向、  

   //:服务器通知浏览器需要进一步操作,从http相应头获(location)得进一步操作的资源、意思在地址栏上发送请求一次   

  //response.sendRedirect("http://localhost/day01/1.html");  

}

                 

HTTP1.1协议在再体验