详解HTTP请求与响应基础及实例

一、HTTP的请求与响应
二、HttpServletRequest和HttpServletResponse对象获取HTTP响应和请求
一、HTTP的请求与响应
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。是客户端和服务器端之间数据传输的格式规范。
通常,由HTTP客户端发起一个请求,服务端一旦收到请求,向客户端返回一个相应(一个请求的发出,有且只有一个响应)。
(一)HTTP请求
请求报文格式如下:
请求行 - 请求头 - 实体内容
例如:
GET /webDemo/Hellow HTTP/1.1 //请求行
Host: localhost:8080 //请求头
Connection: keep-alive
Accept: text/html
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
//空行
//实体内容
1、请求行
请求行的格式为
GET /webDemo/Hellow HTTP/1.1
请求方式 请求资源 http协议版本
(1)请求方式
请求方法有:
1) GET 请求指定的页面信息,并返回实体主体。
2) HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3) POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4) PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5) DELETE 请求服务器删除指定的页面。
6) CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7) OPTIONS 允许客户端查看服务器的性能。
8) TRACE 回显服务器收到的请求,主要用于测试或诊断。
常用的请求方式主要是GET和POST(通常用于表单的提交),浏览器直接访问的请求,默认提交方式为GET。
GET方法
提交的表单数据会在请求行的URI的后面。(以问号开头,跟随者键值对,以&连接)提交的数据大小有限制,不能超过1KB。不适合提交敏感数据。
POST方法
表单提交的数据会包含在实体内容当中。
(2)请求资源
该请求资源为Request-URI是一个统一资源标识符(Uniform Resource Identifier)是一个用于标识某一互联网资源名称的字符串。(本地,局域,互联网)
(3)HTTP协议版本
http 1.0:当浏览器客户端与服务器端建立连接后,发送一次请求后,就关闭连接
http 1.1:当浏览器客户端与服务器端建立连接后,可以在一次连接后,发送多次请求
2、请求头
常见的请求行:
Accept:text/html,image/*
请求报头域用于指定客户端接受哪些类型的信息
Accept-Charset: ISO-8859-1
求资源主机接受的编码格式
Accept-Encoding: gzip,compress
求资源主机接受的数据压缩格式
Accept-Language: en-us,zh-
求资源主机接受的语言
Host: localhost:8080
(必须的)主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的
User-Agent:
求资源主机浏览器类型
Connection:
求资源主机跟服务器连接状态
Connection: close 会发送请求后,自动断开连接
Connection: Keep-Alive 会发送请求后,依然保持连接
Date
求资源主机发出请求的时间
(二)HTTP响应
应答报文格式如下:
响应行 - 响应头 - 实体内容
HTTP/1.1 200 OK //响应行
Server: Apache-Coyote/1.1 //相应头
Content-Length: 0
Date: Thu, 18 May 2017 13:21:23 GMT
//空行
//实体内容
HTTP响应与请求类似,主要了解的是其响应行的状态代码。
状态码:
100-199 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200-299 表示成功接收请求并已完成真个处理过程,常用200
300-399 为完成请求,客户需进一步细化请求
400-499 客户端的请求有错误,常用404
500-599 服务器出现错误,常用500
常见的状态码:
200 表示请求处理完成并完美返回
302 表示请求需要进一细化
404 表示客户端访问的资源找不到
500 表示服务端出现问题
二、HttpServletRequest和HttpServletResponse对象获取HTTP响应和请求
(一)HttpServletRequest
//HttpServletRequest对象的常见方法 //请求行: request.getMethod(); //获取请求的提交方式 request.getRequestURI(); //获取请求的URI request.getProtocol(); //获取请求的协议 //请求头: request.getHeader(); //获取请求头的强求值 request.getHeaderName(); //获取请求头的所有名称 //实体内容: request.getInputStream(); //获取实体内容的输入流
例如,我们可以搭建一个tomcat servlet服务端,来获取用客户端的请求信息。
package sun;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Hellow
*/
@WebServlet("/Hellow")
public class GetRequestInfo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建一个字符串来存储请求信息
StringBuffer req = new StringBuffer();
//获取请求行
//获取请求方法,URI,HTTP版本
req.append(request.getMethod()+" "+request.getRequestURI()+" "+request.getProtocol()+"\n");
//获取请求头
//获取所有请求头
Enumeration<?> headerName = request.getHeaderNames();
while(headerName.hasMoreElements()){
String header= (String)headerName.nextElement();
req.append(header+": ");
//获取指定请求头的值
Enumeration<?> headerValue = request.getHeaders(header);
while(headerValue.hasMoreElements()){
req.append((String)headerValue.nextElement()+";");
}
req.append("\n");
}
req.append("\n");
//获取实体内容
InputStream input = request.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len=input.read(buffer))!=-1){
String str = new String(buffer,0,len);
req.append(str);
}
//输出请求信息
System.out.println(req);
}
}
(二)HttpServletResponse
通过例子,来看通过修改响应信息来实现一些业务逻辑。
package sun;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Response
*/
@WebServlet("/Response")
public class ModifyResponseInfo extends HttpServlet {
/**
* Description:
* 通过HttpServletResponse对象,改变响应信息
* */
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、修改响应行
resp.setStatus(404);
//resp.sendError(404);
//2、修改响应头
resp.setHeader("Server","JBoss");
//3、修改实体内容
//发送字符类型的实体内容
resp.getWriter().write("response");
//发送字节类型的实体内容
resp.getOutputStream().write("response".getBytes());
//4、通过修改响应头,来请求重定向
//发送要给302状态码,location的响应头
/*
当浏览器认识到302状态码的时候,会再次自动向服务器发出一个请求,请求的地址就是location的value值
请求重定向,一共向服务器发出2次请求
*/
resp.setStatus(302);
resp.setHeader("location","/webDemo/index.html");
//也可以直接调用sendRedirect方法直接重定向
//resp.sendRedirect("/webDemo/adv.html");
//5、通过修改响应头,来实现定时刷新页面
//一秒后刷新页面
resp.setHeader("refresh","1");
//也可以定时重定向页面
//resp.setHeader("refresh","1;url=/webDemo/index.html");
//6、通过修改响应头,来修改服务端和客户端的传输的数据类型
//resp.setHeader("content-type","text/html")
//也可以直接调用setContentType方法直接设置
//在web.xml文件中找到对应的数据类型写法
resp.setContentType("text/html");
}
}
(三)获取请求参数
由于GET和POST提交参数的位置不同(POST方法: 表单提交的数据会包含在实体内容当中;GET方法: 提交的表单数据会在请求行的URI的后面。),因此GET和POST方法获取请求参数的方法也不样。
//获取GET方式参数: request.getQueryString(); //获取POST方式参数: request.getInputStream();
但是这样获得的参数,需要进行字符串的拆分以后才能使用。因此,Tomcat自动将GET和POST的请求参数封装在HttpServletRequest对象当中。可以调用以下方法获得:
//根据指定名字来获取参数值
request.getParameter("name");
request.getParameter("password");
//获取所有参数名字
Enumeration<String> params = request.getParameterNames();
while(params.hasMoreElements()){
String param = params.nextElement();
String value = request.getParameter(param);
}
(四)编码问题
服务端和客户端可能存在着编码问题,当服务端和客户端的编码不同时,传输的数据就有可能因为编码问题而导致乱码。
1、手动解码
在获取的每个数据进行手工再次编码,这里是必须知道服务端的编码方式和客户端的编码方法。
name = new String(name.getBytes("iso-8859-1"),"utf-8");
2、设置参数查询码表
在获取数据之前,调用setCharacherEncoding方法设置指定编码格式。
该方法,只能对请求实体内容的编码起作用,所以只能对POST提交参数起作用。
request.setCharacherEncoding(“utf-8”);
3、修改服务器的配置文件
比如,tomcat服务器当中,修改server.xml配置文件
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<!--在这里,加上属性URIEncoding,及指定编码值-->
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>
以上就是HTTP请求与响应基础的详细介绍,如有疑问请大家留言!感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# HTTP请求与响应
# Http
# 的请求与响应的分析
# HTTP中header头部信息详解
# IIS中http头的作用介绍
# 浅析HTTP消息头网页缓存控制以及header常用指令介绍
# HTTP协议详解_动力节点Java学院整理
# HTTP协议常用的请求头和响应头响应详解说明(学习)
# 客户端
# 服务端
# 表单
# 重定向
# 是一个
# 互联网
# 会在
# 可以直接
# 来实现
# 主要用于
# 能对
# 配置文件
# 的是
# 传输协议
# 也不
# 在这里
# 就有
# 如有
# 已有
# 找不到
相关文章:
如何在景安服务器上快速搭建个人网站?
小程序网站制作需要准备什么资料,如何制作小程序?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
建站之星收费标准详解:套餐费用及年费价格表一览
建站之星安装模板失败:服务器环境不兼容?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
怀化网站制作公司,怀化新生儿上户网上办理流程?
如何通过IIS搭建网站并配置访问权限?
音乐网站服务器如何优化API响应速度?
制作网站的软件免费下载,免费制作app哪个平台好?
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何在万网开始建站?分步指南解析
如何快速搭建高效WAP手机网站吸引移动用户?
韩国服务器如何优化跨境访问实现高效连接?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
如何选择高效响应式自助建站源码系统?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
如何在万网自助建站中设置域名及备案?
定制建站是什么?如何实现个性化需求?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
宿州网站制作公司兴策,安徽省低保查询网站?
建站之星伪静态规则如何设置?
建站之星在线客服如何快速接入解答?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
如何在云指建站中生成FTP站点?
如何通过FTP服务器快速搭建网站?
公众号网站制作网页,微信公众号怎么制作?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
建站之星导航配置指南:自助建站与SEO优化全解析
网站制作员失业,怎样查看自己网站的注册者?
北京的网站制作公司有哪些,哪个视频网站最好?
如何快速搭建自助建站会员专属系统?
*服务器网站为何频现安全漏洞?
网站制作需要会哪些技术,建立一个网站要花费多少?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
如何在云服务器上快速搭建个人网站?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
建站主机与虚拟主机有何区别?如何选择最优方案?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
c++ stringstream用法详解_c++字符串与数字转换利器
如何零成本快速生成个人自助网站?
如何在云虚拟主机上快速搭建个人网站?
如何快速搭建高效简练网站?
建站之星后台管理:高效配置与模板优化提升用户体验
如何通过虚拟主机快速搭建个人网站?
如何在腾讯云服务器上快速搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。