一个非常完整的请求和响应demo
前端
发送报文主体、写入cookie(自动随带)、发送自定义的头部信息
<body>
<div>
<button id="btn">发送</button>
</div>
<script src="../js/lib/jquery-3.2.1.js"></script>
<script>
document.cookie = "cookieKey=cookieValue";
//ajax技术核心:XMLHttpRequest
// 在不重新加载页面的情况下更新网页
// 在页面已加载后从服务器请求数据
// 在页面已加载后从服务器接收数据
// 在后台向服务器发送数据
$('#btn').click(function () {
$.ajax({
url: "postTest.do",
type: "POST",
dataType: "text",
headers: {"aa":"this is my headerData"},
contentType:"application/text;charset=UTF-8",
data:"this is client request data",
success: function(data,status,xmlhttp) {
alert(data);
alert(status);
alert(xmlhttp.status);
//响应实体的类型由 responseType 来指定, 可以
alert(xmlhttp.responseText);
//打印所有的头部信息
alert(xmlhttp.getAllResponseHeaders());
//按照key-value的形式取出响应的头部信息
alert(xmlhttp.getResponseHeader('Content-Type'));
alert('token='+xmlhttp.getResponseHeader('token'));
},
error: function() {
alert("请求出错!");
}
});
});
</script>
</body>
java后台
接收有:解析头部信息、主体信息、主体信息。并也返回这些信息。
@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
@ResponseBody
public String postTest(HttpServletRequest request, HttpServletResponse response) throws IOException {
//接收 cookie////////////////////////////////////////////////
Cookie[] cookies = request.getCookies();
System.out.println("Cookie长度:" + cookies.length); //读取本机共存在多少COOKIE
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("cookieKey")) {
System.out.println("cookie:cookieKey=" + URLDecoder.decode(cookies[i].getValue(),"UTF-8"));
}
}
} else {
System.out.println("没有任何Cookie");
}
//接收 头部信息
System.out.println("头部信息如下");
System.out.println("request.getHeader(\"user-agent\") = :"+request.getHeader("user-agent"));
System.out.println("request.getHeader(\"Referer\") = :"+request.getHeader("Referer"));
System.out.println("request.getHeader(\"Accept\") = :"+request.getHeader("Accept"));
System.out.println("request.getHeader(\"Host\"):"+request.getHeader("Host"));
System.out.println("request.getHeader(\"aa\"):"+request.getHeader("aa"));
//接收 客户端的基本信息
System.out.println("请求的基本信息如下");
System.out.println("request.getRequestURL() = :"+request.getRequestURL());
System.out.println("request.getRequestURI() = :"+request.getRequestURI());//可用于REST API构建!
System.out.println("request.getRemoteHost() = :"+request.getRemoteHost());
System.out.println("request.getRemotePort() = :"+request.getRemotePort());
System.out.println("request.getLocalAddr() = :"+request.getLocalAddr());
System.out.println("request.getLocalName() = :"+request.getLocalName());
System.out.println("request.getMethod() = :"+request.getMethod());
System.out.println("解析HTTP POST方式的报文主体如下:");
//接收报文主体数据
DataInputStream in = new DataInputStream(request.getInputStream());
int totalBytes = request.getContentLength();
byte[] b = new byte[totalBytes];
in.readFully(b);
in.close();
String reqContent = new String(b, "UTF-8");
System.out.println("request.getInputStream()解析的报文主体 = "+reqContent);
//返回cookie////////////////////////////////////////////////
//创建一个cookie
Cookie cookie = new Cookie("key1", "cookieValue1");
cookie.setPath("/");// 这个要设置
// cookie.setDomain(".zhangsan.com");//这样设置,能实现两个网站共用
cookie.setMaxAge(365 * 24 * 60 * 60);// 不设置的话,则cookies不写入硬盘,而是写在内存,只在当前页面有用,以秒为单位,关闭浏览器就没了
response.addCookie(cookie); //添加cookie到响应对象中
//创建第二个cookie
cookie = new Cookie("key2", "cookieValue2");
cookie.setPath("/");
cookie.setMaxAge(365 * 24 * 60 * 60);
response.addCookie(cookie); //添加cookie到响应对象中
//删除一个cookie:添加第三个Cookie 用这个cookie来毁掉之前的那个cookie 达到删除的效果!
cookie = new Cookie("username","");//这边得用"",不能用null
cookie.setPath("/");//设置成跟写入cookies一样的
cookie.setMaxAge(0);
response.addCookie(cookie);
//添加到HTTP头部信息:让头部携带token信息!
response.setHeader("token","bb999888");
//返回响应报文主体数据!
return "来自后台的数据!";
}
结果输出
Cookie长度:5
cookie:cookieKey=cookieValue
头部信息如下
request.getHeader("user-agent") = :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:60.0) Gecko/20100101 Firefox/60.0
request.getHeader("Referer") = :http://localhost:8080/
request.getHeader("Accept") = :text/plain, */*; q=0.01
request.getHeader("Host"):localhost:8080
request.getHeader("aa"):this is my headerData
请求的基本信息如下
request.getRequestURL() = :http://localhost:8080/postTest.do
request.getRequestURI() = :/postTest.do
request.getRemoteHost() = :0:0:0:0:0:0:0:1
request.getRemotePort() = :50403
request.getLocalAddr() = :0:0:0:0:0:0:0:1
request.getLocalName() = :localhost
request.getMethod() = :POST
解析HTTP POST方式的报文主体如下:
request.getInputStream()解析的报文主体 = this is client request data
1. $.ajax()发送请求带上头部信息
$('#btn').click(function () {
var inVal = $('#inVal').val();
$.ajax({
url: "postTest.do",
headers:{"appId":"123","appKey":"456"},
type: "POST",
dataType: "text",
contentType:"application/text;charset=UTF-8",
data:inVal,
success: function(data) {
alert(data);
},
error: function() {
alert("请求出错!");
}
});
});
2. 接收头部信息并返回接收的主体信息
@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
@ResponseBody
public String postTest2(@RequestBody String data,@RequestHeader("appId") String appId){
System.out.println("\n\ndata = :"+data);
System.out.println("\n\nappId = :"+appId);
return data;
}
基于$.ajax()提交
一、解析POST请求(内容放在HTTP报文主体中)
$.ajax POST请求
$.ajax({
url: "postTest.do?",
type: "POST",
dataType: "text",
contentType:"application/text;charset=UTF-8",
data: {"key1":"val1","key2":"val2"},
success: function(data) {
alert(data);
},
error: function() {
alert("请求出错!");
}
});
java后台代码:
主要通过request.getInputStream()来接收HTTP报文主体内容!
@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
@ResponseBody
public String postTest(HttpServletRequest request) throws IOException {
System.out.println("请求的基本信息如下");
System.out.println("request.getRequestURL() = :"+request.getRequestURL());
System.out.println("request.getRequestURI() = :"+request.getRequestURI());//可用于REST API构建!
System.out.println("request.getRemoteHost() = :"+request.getRemoteHost());
System.out.println("request.getRemotePort() = :"+request.getRemotePort());
System.out.println("request.getLocalAddr() = :"+request.getLocalAddr());
System.out.println("request.getLocalName() = :"+request.getLocalName());
System.out.println("request.getMethod() = :"+request.getMethod());
System.out.println("解析HTTP POST方式的报文主体如下:");
System.out.println("request.getParameter(\"aa\") = :"+request.getParameter("aa"));
DataInputStream in = new DataInputStream(request.getInputStream());
int totalBytes = request.getContentLength();
byte[] b = new byte[totalBytes];
in.readFully(b);
in.close();
String reqContent = new String(b, "UTF-8");
System.out.println("request.getInputStream()解析的报文主体 = "+reqContent);
System.out.println("头部信息如下");
System.out.println("request.getHeader(\"user-agent\") = :"+request.getHeader("user-agent"));
System.out.println("request.getHeader(\"Referer\") = :"+request.getHeader("Referer"));
System.out.println("request.getHeader(\"Accept\") = :"+request.getHeader("Accept"));
System.out.println("request.getHeader(\"Host\"):"+request.getHeader("Host"));
return "来自后台的数据!";
}
打印输出如下:
请求的基本信息如下
request.getRequestURL() = :http://localhost:8080/postTest.do
request.getRequestURI() = :/postTest.do
request.getRemoteHost() = :0:0:0:0:0:0:0:1
request.getRemotePort() = :55300
request.getLocalAddr() = :0:0:0:0:0:0:0:1
request.getLocalName() = :localhost
request.getMethod() = :POST
解析HTTP POST方式的报文主体如下:
request.getParameter("aa") = :null
request.getInputStream()解析的报文主体 = key1=val1&key2=val2
头部信息如下
request.getHeader("user-agent") = :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:60.0) Gecko/20100101 Firefox/60.0
request.getHeader("Referer") = :http://localhost:8080/
request.getHeader("Accept") = :text/plain, */*; q=0.01
request.getHeader("Host"):localhost:8080
二、解析GET请求参数(放在HTTP URL上)
$.ajax GET请求
$.ajax({
url: "postTest.do?",
type: "GET",
dataType: "text",
contentType:"application/text;charset=UTF-8",
data: {"key1":"val1","key2":"val2"},
success: function(data) {
alert(data);
},
error: function() {
alert("请求出错!");
}
});
java后台代码:
主要通过request.getQueryString()来接收HTTP的参数列表(放在URL部分)!
@RequestMapping(value="postTest.do",method= RequestMethod.GET,produces = "application/text;charset=UTF-8;")
@ResponseBody
public String postTest(HttpServletRequest request) throws IOException {
System.out.println("GET请求的参数数据");
System.out.println("\nrequest.getQueryString() = :"+request.getQueryString());
System.out.println("请求的基本信息如下");
System.out.println("request.getRequestURL() = :"+request.getRequestURL());
System.out.println("request.getRequestURI() = :"+request.getRequestURI());//可用于REST API构建!
System.out.println("request.getRemoteHost() = :"+request.getRemoteHost());
System.out.println("request.getRemotePort() = :"+request.getRemotePort());
System.out.println("request.getLocalAddr() = :"+request.getLocalAddr());
System.out.println("request.getLocalName() = :"+request.getLocalName());
System.out.println("request.getMethod() = :"+request.getMethod());
System.out.println("头部信息如下");
System.out.println("request.getHeader(\"user-agent\") = :"+request.getHeader("user-agent"));
System.out.println("request.getHeader(\"Referer\") = :"+request.getHeader("Referer"));
System.out.println("request.getHeader(\"Accept\") = :"+request.getHeader("Accept"));
System.out.println("request.getHeader(\"Host\"):"+request.getHeader("Host"));
return "来自后台的数据!";
}
打印输出
GET请求的参数数据
request.getQueryString() = :&key1=val1&key2=val2
请求的基本信息如下
request.getRequestURL() = :http://localhost:8080/postTest.do
request.getRequestURI() = :/postTest.do
request.getRemoteHost() = :0:0:0:0:0:0:0:1
request.getRemotePort() = :56121
request.getLocalAddr() = :0:0:0:0:0:0:0:1
request.getLocalName() = :localhost
request.getMethod() = :GET
头部信息如下
request.getHeader("user-agent") = :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:60.0) Gecko/20100101 Firefox/60.0
request.getHeader("Referer") = :http://localhost:8080/
request.getHeader("Accept") = :text/plain, */*; q=0.01
request.getHeader("Host"):localhost:8080
基于Form提交的处理
普通表单提交
HTML
<form action="postTest.do" method="GET" accept-charset="UTF-8">
<p>First name: <input type="text" name="userName" /></p>
<p>Last name: <input type="text" name="passWord" /></p>
<input type="submit" value="提交表单" />
</form>
java后台:
request.getParameter()均可接收POST和GET请求的表单数据,都可以用request.getParameter("passWord"));方法来解析表单数据!
request.getQueryString()不可用于POST请求。
@RequestMapping(value="postTest.do",method= RequestMethod.GET,produces = "application/text;charset=UTF-8;")
@ResponseBody
public String postTest(HttpServletRequest request) throws IOException {
System.out.println("POST请求的参数数据");
String str = "";
String reqMethod = request.getMethod();
if(reqMethod.equals("GET"))
str = request.getQueryString();
else//POST
str = request.getParameter("userName");
String cs= URLDecoder.decode(str,"utf-8");//将中文转码
System.out.println("userName = :"+cs);
System.out.println("passWord = :"+request.getParameter("passWord"));
System.out.println("请求的基本信息如下");
System.out.println("request.getRequestURL() = :"+request.getRequestURL());
System.out.println("request.getRequestURI() = :"+request.getRequestURI());//可用于REST API构建!
System.out.println("request.getRemoteHost() = :"+request.getRemoteHost());
System.out.println("request.getRemotePort() = :"+request.getRemotePort());
System.out.println("request.getLocalAddr() = :"+request.getLocalAddr());
System.out.println("request.getLocalName() = :"+request.getLocalName());
System.out.println("request.getMethod() = :"+request.getMethod());
System.out.println("头部信息如下");
System.out.println("request.getHeader(\"user-agent\") = :"+request.getHeader("user-agent"));
System.out.println("request.getHeader(\"Referer\") = :"+request.getHeader("Referer"));
System.out.println("request.getHeader(\"Accept\") = :"+request.getHeader("Accept"));
System.out.println("request.getHeader(\"Host\"):"+request.getHeader("Host"));
return "来自后台的数据!";
}
打印
POST请求的参数数据
userName = :userName=张三&passWord=123456
passWord = :123456
请求的基本信息如下
request.getRequestURL() = :http://localhost:8080/postTest.do
request.getRequestURI() = :/postTest.do
request.getRemoteHost() = :0:0:0:0:0:0:0:1
request.getRemotePort() = :60414
request.getLocalAddr() = :0:0:0:0:0:0:0:1
request.getLocalName() = :localhost
request.getMethod() = :GET
头部信息如下
request.getHeader("user-agent") = :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:60.0) Gecko/20100101 Firefox/60.0
request.getHeader("Referer") = :http://localhost:8080/
request.getHeader("Accept") = :text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
request.getHeader("Host"):localhost:8080
上传文件的表单提交:
添加依赖(同时需要两个依赖!)
<!--上传文件-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>1.4.1</version>
</dependency>
配置:在bean的配置文件中添加!
<!--上传文件-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1000000"></property>
</bean>
HTML几个必须
a. enctype="multipart/form-data
b. 必须为POST请求:method="POST"
<form enctype="multipart/form-data" action="postTest.do" method="POST" accept-charset="UTF-8">
<input type="file" name="file">
<input type="submit" value="上传" />
</form>
java接收:一个必须
必须要MultipartFile类对象来接收!
@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
@ResponseBody
public String postTest(@RequestParam("file") MultipartFile file) {
System.out.println("\n\n fileName = :"+file.getOriginalFilename());
return "来自后台的数据!";
}
基于$.ajax的接收并解析响应
js
$('#btn').click(function () {
$.ajax({
url: "postTest.do",
type: "POST",
dataType: "text",
contentType:"application/text;charset=UTF-8",
success: function(data,status,xmlhttp) {
alert(data);
alert(status);
alert(xmlhttp.status);
//响应实体的类型由 responseType 来指定, 可以
alert(xmlhttp.responseText);
//打印所有的头部信息
alert(xmlhttp.getAllResponseHeaders());
//按照key-value的形式取出响应的头部信息
alert(xmlhttp.getResponseHeader('Content-Type'));
alert('token='+xmlhttp.getResponseHeader('token'));
},
error: function() {
alert("请求出错!");
}
});
});
java(并写入token在响应HTTP的头部)
@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
@ResponseBody
public String postTest(HttpServletRequest request, HttpServletResponse response){
response.setHeader("token","bb999888");
return "来自后台的数据!";
}
带上cookie
@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
@ResponseBody
public String postTest(HttpServletRequest request, HttpServletResponse response) throws IOException {
Cookie[] cookies = request.getCookies();
System.out.println("Cookie长度:" + cookies.length); //读取本机共存在多少COOKIE
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("username")) {
System.out.println("cookie:username=" + URLDecoder.decode(cookies[i].getValue(),"UTF-8"));
}
}
} else {
System.out.println("没有任何Cookie");
}
//创建一个cookie
Cookie cookie = new Cookie("key1", "cookieValue1");
cookie.setPath("/");// 这个要设置
// cookie.setDomain(".zhangsan.com");//这样设置,能实现两个网站共用
cookie.setMaxAge(365 * 24 * 60 * 60);// 不设置的话,则cookies不写入硬盘,而是写在内存,只在当前页面有用,以秒为单位,关闭浏览器就没了
response.addCookie(cookie); //添加cookie到响应对象中
//创建第二个cookie
cookie = new Cookie("key2", "cookieValue2");
cookie.setPath("/");
cookie.setMaxAge(365 * 24 * 60 * 60);
response.addCookie(cookie); //添加cookie到响应对象中
//删除一个cookie:添加第三个Cookie 用这个cookie来毁掉之前的那个cookie 达到删除的效果!
cookie = new Cookie("username","");//这边得用"",不能用null
cookie.setPath("/");//设置成跟写入cookies一样的
cookie.setMaxAge(0);
response.addCookie(cookie);
return "来自后台的数据!";
}