HTTP请求数据总共分为三部分内容,分别是==请求行、请求头、请求体==,对于这三部分内容的数据,分别该如何获取,首先我们先来学习请求行数据如何获取?
首先要注意:
GET和POST两个请求之间的区别:
GET请求请求参数在请求行中,没有请求体,POST请求请求参数在请求体中
GET请求请求参数大小有限制,POST没有
POST请求数据在请求体中,GET请求数据在请求行上
1 获取请求行数据
请求行包含三块内容,分别是请求方式、请求资源路径、HTTP协议及版本![1628748240075.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1657078133070-9a081b42-86a2-4f93-a818-9dc4a4edda0e.png#clientId=u57206351-a584-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=89&id=u81af16ff&margin=%5Bobject%20Object%5D&name=1628748240075.png&originHeight=111&originWidth=697&originalType=binary&ratio=1&rotation=0&showTitle=false&size=34235&status=done&style=none&taskId=u1b202155-2de0-4a62-9f50-a08ed209dfe&title=&width=557.6)
对于这三部分内容,request对象都提供了对应的API方法来获取,具体如下:
- 获取请求方式: GET
String getMethod()
- 获取虚拟目录(项目访问路径): /request-demo
String getContextPath() //war包放到tomcat里面 解压后有个文件夹 文件夹名字也是ContextPath
- 获取URL(统一资源定位符): http://localhost:8080/request-demo/req1
StringBuffer getRequestURL() //得到的是个字符串 得到的是个全路径
- 获取URI(统一资源标识符): /request-demo/req1
String getRequestURI() //得到的是把本服务器去除掉的路径
- 获取请求参数(GET方式): username=zhangsan&password=123
String getQueryString() //获取到?号后面的内容
介绍完上述方法后,咱们通过代码把上述方法都使用下:
启动服务器,访问http://localhost:8080/mavenDemo01/myjava20?username=zhangsan&passwrod=123,获取的结果如下:![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1657080199919-f4f97404-208e-4a3c-9d19-37626f2c626a.png#clientId=u57206351-a584-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=151&id=ubd067c81&margin=%5Bobject%20Object%5D&name=image.png&originHeight=189&originWidth=676&originalType=binary&ratio=1&rotation=0&showTitle=false&size=59318&status=done&style=none&taskId=u144f6d01-3847-4b42-8140-af2b2ca1592&title=&width=540.8)
2 获取请求头数据
对于请求头的数据,格式为key: value如下:
所以根据请求头名称获取对应值的方法为:
String getHeader(String name); //获得请求头数据
接下来,在代码中如果想要获取客户端浏览器的版本信息,则可以使用
重新启动服务器后http://localhost:8080/mavenDemo01/myjava20?username=zhangsan&passwrod=123,获取的结果如下:
3 获取请求体数据
浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST,请求体中的数据格式如下:
对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:
- 获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
- ServletInputStream getInputStream() 该方法可以获取字节
- 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
- BufferedReader getReader()
这个流和 getInputStream一样 不需要被释放close 因为这个流来自于 request参数 而request会由tomcat帮我们自动释放
接下来,大家需要思考,要想获取到请求体的内容该如何实现?
具体实现的步骤如下: 1.准备一个页面,在页面中添加form表单,用来发送post请求 2.在Servlet的doPost方法中获取请求体数据 3.在doPost方法中使用request的getReader()或者getInputStream()来获取 4.访问测试
- 在项目的webapp目录下添加一个html页面,名称为:
req.html
- 在Servlet的doPost方法中获取数据
- 调用getReader()或者getInputStream()方法,因为目前前端传递的是纯文本数据,所以我们采用getReader()方法来获取
==注意==
BufferedReader流是通过request对象来获取的,当请求完成后request 对象就会被销毁,request对象被销毁后,BufferedReader流就会自动 关闭,所以此处就不需要手动关闭流了。
- 启动服务器,通过浏览器访问http://localhost:8080/request-demo/req.html![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1657156969014-b6a52f9e-0585-4989-9810-be64026aa77e.png#clientId=ucfbc5724-f787-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=384&id=u5def06d5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=480&originWidth=1178&originalType=binary&ratio=1&rotation=0&showTitle=false&size=256525&status=done&style=none&taskId=u79ab076a-7c9d-4ea8-b642-4f17a901b0a&title=&width=942.4)
小结
HTTP请求数据中包含了请求行、请求头和请求体,针对这三部分内容,Request对象都提供了对应的API方法来获取对应的值:
- 请求行
- getMethod()获取请求方式
- getContextPath()获取项目访问路径
- getRequestURL()获取请求URL
- getRequestURI()获取请求URI
- getQueryString()获取GET请求方式的请求参数
- 请求头
- getHeader(String name)根据请求头名称获取其对应的值
- 请求体
- 注意: ==浏览器发送的POST请求才有请求体==
- 如果是纯文本数据:getReader()
- 如果是字节数据如文件数据:getInputStream()