HttpServletRequest对象代表客户端的请求,当客户端通过http协议请求访问
服务器的时候,http请求头的所有信息都封装在这个对象中,通过这个对象,可以获取客户端请求的所有信息。http请求包含请求行/状态行、请求头、请求体。
request如果是post才有请求体,get则没有请求体,直接跟在?后面,用&隔开。
getHeader(String name)获取单个请求头name对应的value
getHeaders(String name)获取多个请求头对应的一组value,因此返回的是枚举类型的数据
getHeaderNames()获取请求头的所有name值,返回的数据也是一个枚举类型数据,将枚举中的元素遍历出来,根据name取到value,即是请求头的所有信息。
请求头header一般用来存放一些cookie,token信息;
请求体body一般用来存储post的参数和参数数据;
我们用postman测试下
Params
school:XiaMen
Header
userName:chen
body
{"class":"test"}
package com.example.demo;
import java.io.BufferedReader;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
@RequestMapping("/hello")
public String hello(HttpServletRequest request,HttpServletResponse response){
/**
* HttpServletRequest对象代表客户端的请求,当客户端通过http协议请求访问
* 服务器的时候,http请求头的所有信息都封装在这个对象中,通过这个对象,可以获取
* 客户端请求的所有信息.
* http请求包含请求行/状态行、请求头、请求体
*/
//客户端请求uri
String uri = request.getRequestURI();
//客户端请求行中的参数部分
String queryString = request.getQueryString();
//返回url的额外路径信息
String pathInfo = request.getPathInfo();
//客户端ip
String ip = request.getRemoteAddr();
//客户端完整主机名
String host = request.getRemoteHost();
//客户端端口
int port = request.getRemotePort();
//获取web服务器的主机和端口,主机名
String webHost = request.getLocalAddr();
int webPort = request.getLocalPort();
String webName = request.getLocalName();
//获取请求头信息
Enumeration<String> headers = request.getHeaderNames();
System.out.println("请求头信息");
while(headers.hasMoreElements()){
String headName = (String)headers.nextElement();
String headValue = request.getHeader(headName);
System.out.println(headName+":"+headValue);
}
System.out.println("请求参数");
//request如果是post才有请求体,get则没有请求体,直接跟在?后面,用&隔开
/**
* getHeader(String name)获取单个请求头name对应的value
* getHeaders(String name)获取多个请求头对应的一组value,因此返回的是枚举类型的数据
* getHeaderNames()获取请求头的所有name值,返回的数据也是一个枚举类型数据,将枚举中的元素遍历出来,根据name取到value,即是请求头的所有信息
*/
//获取客户端请求参数
//request对象封装的参数是以Map的形式存储的
Map<String, String[]> paramMap = request.getParameterMap();
for(Map.Entry<String, String[]> entry :paramMap.entrySet()){
String paramName = entry.getKey();
String paramValue = "";
String[] paramValueArr = entry.getValue();
for (int i = 0; paramValueArr!=null && i < paramValueArr.length; i++) {
if (i == paramValueArr.length-1) {
paramValue+=paramValueArr[i];
}else {
paramValue+=paramValueArr[i]+",";
}
}
System.out.println(MessageFormat.format("{0}={1}", paramName,paramValue));
}
//请求体
try {
System.out.println("请求体");
charReader(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "hello world";
}
void charReader(HttpServletRequest request) throws Exception{
BufferedReader br = request.getReader();
String str, wholeStr = "";
while((str = br.readLine()) != null){
wholeStr += str;
}
System.out.println(wholeStr);
}
}
输出结果
==============================================
请求头信息
username:chen
cache-control:no-cache
postman-token:58cf0ebc-5448-4460-95db-8610bec65927
content-type:text/plain
user-agent:PostmanRuntime/7.4.0
accept:*/*
host:localhost:8080
accept-encoding:gzip, deflate
content-length:16
connection:keep-alive
请求参数
school=XiaMen
请求体
{"class":"test"}
往请求头header里设置参数和参数value,可以使用HttpClient访问rest接口,往请求头里添加token验证信息
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet("http://localhost:8080/index");
try {
get.setHeader("token", "jdlj939399lKDN");
CloseableHttpResponse response2 = client.execute(get);
HttpEntity entity = response2.getEntity();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}