HTTP请求数据总共分为三部分内容,分别是==请求行、请求头、请求体==,对于这三部分内容的数据,分别该如何获取,首先我们先来学习请求行数据如何获取?

首先要注意:

GET和POST两个请求之间的区别:
GET请求请求参数在请求行中,没有请求体,POST请求请求参数在请求体中
GET请求请求参数大小有限制,POST没有
POST请求数据在请求体中,GET请求数据在请求行上

1 获取请求行数据

  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

StringBuffer getRequestURL() //得到的是个字符串 得到的是个全路径

  • 获取URI(统一资源标识符): /request-demo/req1

String getRequestURI() //得到的是把本服务器去除掉的路径

  • 获取请求参数(GET方式): username=zhangsan&password=123

String getQueryString() //获取到?号后面的内容
介绍完上述方法后,咱们通过代码把上述方法都使用下:
image.png启动服务器,访问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如下:1628768652535.png
所以根据请求头名称获取对应值的方法为:
String getHeader(String name); //获得请求头数据
接下来,在代码中如果想要获取客户端浏览器的版本信息,则可以使用image.pngimage.png
重新启动服务器后http://localhost:8080/mavenDemo01/myjava20?username=zhangsan&passwrod=123,获取的结果如下: image.png

3 获取请求体数据

浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST,请求体中的数据格式如下:1628768665185.png
对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:

  • 获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
    • ServletInputStream getInputStream() 该方法可以获取字节
  • 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
    • BufferedReader getReader()

这个流和 getInputStream一样 不需要被释放close 因为这个流来自于 request参数 而request会由tomcat帮我们自动释放
image.pngimage.png
接下来,大家需要思考,要想获取到请求体的内容该如何实现?

具体实现的步骤如下: 1.准备一个页面,在页面中添加form表单,用来发送post请求 2.在Servlet的doPost方法中获取请求体数据 3.在doPost方法中使用request的getReader()或者getInputStream()来获取 4.访问测试

  1. 在项目的webapp目录下添加一个html页面,名称为:req.htmlimage.png
  2. 在Servlet的doPost方法中获取数据image.png
  3. 调用getReader()或者getInputStream()方法,因为目前前端传递的是纯文本数据,所以我们采用getReader()方法来获取image.png

==注意==
BufferedReader流是通过request对象来获取的,当请求完成后request 对象就会被销毁,request对象被销毁后,BufferedReader流就会自动 关闭,所以此处就不需要手动关闭流了。

  1. 启动服务器,通过浏览器访问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()