HTTP协议:HTTP响应和相关API案例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP协议:HTTP响应和相关API案例相关的知识,希望对你有一定的参考价值。

1、HTTP响应的知识


1.1、HTTP响应的示例

HTTP响应由四部分组成:响应行、响应头、一个空行和实体内容。

HTTP响应的组成:

|--响应行

|--响应头

|--(一个空行)

|--实体内容

HTTP响应示例:

    HTTP/1.1 200 OK                --响应行
    Server: Apache-Coyote/1.1      --响应头(key-vaule)
    Content-Length: 24
    Date: Fri, 30 Jan 2015 01:54:57 GMT
                                   --(一个空行)
    this is hello servlet!!!       --实体内容


1.2、响应行

#http协议版本

#状态码: 服务器处理请求的结果(状态)

常见的状态:

200 :  表示请求处理完成并完美返回

302:   表示请求需要进一步细化。

404:   表示客户访问的资源找不到。

500:   表示服务器的资源发生错误。(服务器内部错误)

#状态描述

1.3、常见的响应头

    Location: http://www.rk.com/index.jsp     ---表示重定向的地址,该头和302的状态码一起使用。
    Server:apache tomcat                      ---表示服务器的类型
    Content-Encoding: gzip                    ---表示服务器发送给浏览器的数据压缩类型
    Content-Length: 80                        ---表示服务器发送给浏览器的数据长度
    Content-Language: zh-cn                   ---表示服务器支持的语言
    Content-Type: text/html; charset=GB2312   ---表示服务器发送给浏览器的数据类型及内容编码
    Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT   ---表示服务器资源的最后修改时间
    Refresh: 1;url=http://www.rk.com          ---表示定时刷新
    Content-Disposition: attachment; filename=aaa.zip    ---表示告诉浏览器以下载方式打开资源(下载文件时用到)
    Transfer-Encoding: chunked
    Set-Cookie:SS=Q0=5Lb_nQ; path=/search      --表示服务器发送给浏览器的cookie信息(会话管理用到)
    Expires: -1                           --表示通知浏览器不进行缓存
    Cache-Control: no-cache
    Pragma: no-cache
    Connection: close/Keep-Alive           --表示服务器和浏览器的连接状态。close:关闭连接 keep-alive:保存连接


2、HttpServletResponse对象


2.1、HttpServletResponse对象核心API

HttpServletResponse对象核心API
类别API
响应行

response.setStatus()  设置状态码

响应头

response.setHeader("name","value")  设置响应头

实体内容

response.getWriter().writer();   发送字符实体内容

response.getOutputStream().writer()  发送字节实体内容




2.2、设置响应信息

package com.rk.http.b_response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 设置响应信息
 */
public class Demo06 extends HttpServlet
{

	/**
	 * 1)tomcat服务器把请求信息封装到HttpServletRequest对象,且把响应信息封装到HttpServletResponse
	 * 2)tomcat服务器调用doGet方法,传入request和response对象
	 * 3)通过response对象改变响应信息
	 * 4)tomcat服务器把response对象的内容转换成响应格式内容,再发送给浏览器解析。
	 */
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		/**
		 * 响应行
		 */
//		response.setStatus(404);//修改状态码
//		response.sendError(404);// 发送404的状态码+404的错误页面
//		response.sendError(404,"这是一个404错误");// 发送404的状态码+404的错误页面+错误信息
		
		/**
		 * 响应头
		 */
		response.setHeader("server", "JBoss");
		
		/**
		 * 实体内容(浏览器直接能够看到的内容就是实体内容)
		 */
//		response.getWriter().write("01.hello world"); //字符内容。
		response.getOutputStream().write("02.hello world".getBytes());//字节内容
	}
}


2.3、请求重定向

package com.rk.http.b_response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 案例- 请求重定向
 *(相当于超链接跳转页面)
 */
public class Demo07 extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		/**
		 * 需求: 跳转到ad.html
		 * 使用请求重定向: 发送一个302状态码+location的响应头
		 */
		response.setStatus(302);
		response.setHeader("location", "/RK007HTTP/ad.html");
		
		//请求重定向简化写法
		response.sendRedirect("/RK007HTTP/ad.html");
	}

}


2.4、定时刷新

package com.rk.http.b_response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 案例- 定时刷新
 *
 */
public class Demo08 extends HttpServlet
{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		/**
		 * 定时刷新
		 * 原理:浏览器认识refresh头,得到refresh头之后重新请求当前资源
		 */
//		response.setHeader("refresh", "3");
		
		/**
		 * 隔n秒之后跳转另外的资源
		 */
//		response.setHeader("refresh", "3;url=/RK007HTTP/ad.html");//跳转到项目内的页面
		response.setHeader("refresh", "3;url=http://www.baidu.com");//跳转到项目外的网页
	}

}


2.5、ContentType的作用

package com.rk.http.b_response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *案例- ContentType的作用
 *
 */
public class Demo09 extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		/**
		 * 设置响应实体内容编码
		 */
		response.setCharacterEncoding("UTF-8");
		
		//服务器发送给浏览器的数据类型和内容编码
		response.setContentType("text/html;charset=utf-8");//推荐使用此方法。效果等同于response.setHeader("content-type", "text/html;charset=utf-8");
//		response.setContentType("application/xml;charset=utf-8");//用这种方式,内容将以xml的格式进行显示
		response.getWriter().write("<html><head><title>这里是标题</title></head><body>这里是body的内容</body></html>");
		
		/**
		 * 通过response.getOutputStream().write()方法输出的内容不受setCharacterEncoding和setContentType中设置的编码的影响。
		 * 默认情况下是GBK编码,浏览器需要以GBK编码才能正确显示页面内容。
		 */
//		response.getOutputStream().write("<html><head><title>this is tilte</title></head><body>中国</body></html>".getBytes());//GBK编码
//		response.getOutputStream().write("<html><head><title>this is tilte</title></head><body>中国</body></html>".getBytes("utf-8"));
	}
	
}


2.6、以下载方式打开图片

package com.rk.http.b_response;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 以下载方式打开图片
 *
 */
public class Demo10 extends HttpServlet
{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		response.setContentType("image/jpeg");
		File file = new File("E:\\IMAGE\\人体常用穴位背面.jpg");
		
		/**
		 * 设置以下载方式打开文件
		 */
		String fileName = file.getName();
		String encodeFileName = java.net.URLEncoder.encode(fileName,"utf-8");
		response.setHeader("Content-Disposition", "attachment; filename="+encodeFileName);
		
		InputStream inStream = new FileInputStream(file);
		byte[] buf = new byte[1024];
		int len = 0;
		while((len=inStream.read(buf, 0, buf.length)) != -1)
		{
			response.getOutputStream().write(buf, 0, len);
		}
	}

}



以上是关于HTTP协议:HTTP响应和相关API案例的主要内容,如果未能解决你的问题,请参考以下文章

前端基础(http协议相关篇)

HTTP协议:HTTP请求案例

HTTP协议请求响应模型

HTTP协议请求响应模型

HTTP http相关知识点详解

通过使用Socket来向Servlet服务器发送GET和POST的HTTP请求协议以及响应案例