java获取GET和POST请求参数

刺骨的言语ヽ痛彻心扉 2022-06-09 07:41 971阅读 0赞

URL和参数列表

一 获取请求方式
request.getMethod(); get和post都可用,

二 获取请求类型

request.getContentType(); get和post都可用,示例值:application/json ,multipart/form-data, application/xml等

三 获取所有参数key

request.getParameterNames(); get和post都可用,注:不适用contentType为multipart/form-data

四 获取参数值value

request.getParameter(“test”); get和post都可用,注:不适用contentType为multipart/form-data

五 获取取参数请求集合

request.getParameterMap(); get和post都可用,注: 不适用contentType为multipart/form-data

六 获取文本流

request.getInputStream() 适用于如:application/json,xml,multipart/form-data文本流或者大文件形式提交的请求或者xml等形式的报文

七 获取URL

getRequestURL()

八 获取参数列表:

1.getQueryString()

只适用于GET,比如客户端发送http://localhost/testServlet?a=b&c=d&e=f,通过request.getQueryString()得到的是a=b&c=d&e=f.

2.getParameter()
GET和POST都可以使用
但如果是POST请求要根据

表单提交数据的编码方式来确定能否使用.
当编码方式是(application/x- www-form-urlencoded)时才能使用.
这种编码方式(application/x-www-form-urlencoded)虽然简单,但对于传输大块的二进制数据显得力不从心.
对于传输大块的二进制数这类数据,浏览器采用了另一种编码方式(“multipart/form-data”),这时就需要使用下面的两种方法.

3.getInputStream()
4.getReader()
上面两种方法获取的是Http请求包的包体,因为GET方式请求一般不包含包体.所以上面两种方法一般用于POST请求获取参数.

需要注意的是:
request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。
比如:
当form表单内容采用 enctype=application/x-www-form-urlencoded编码时,先通过调用request.getParameter()方法得到参数后,
再调用request.getInputStream()或request.getReader()已经得不到流中的内容,
因为在调用 request.getParameter()时系统可能对表单中提交的数据以流的形式读了一次,反之亦然。

当form表单内容采用 enctype=multipart/form-data编码时,即使先调用request.getParameter()也得不到数据,
所以这时调用request.getParameter()方法对 request.getInputStream()或request.getReader()没有冲突,
即使已经调用了 request.getParameter()方法也可以通过调用request.getInputStream()或request.getReader()得到表单中的数据,
而request.getInputStream()和request.getReader()在同一个响应中是不能混合使用的,如果混合使用就会抛异常。

九:下面附上解析multipart/form-data格式的报文方法,

示例报文如下:

Center

![Image 1][]

解析:(利用upload方式解析的可以忽略)

  1. /**
  2. * 解析multipart/form-data
  3. * @param res 这是通过request.getInputStream()都出来的报文
  4. * @param contentType multipart/form-data
  5. * @return 解析multipart/form-data格式提交过来的的流,转成json,这里忽略了报文中的“文件”部分,只解析“文本”字段
  6. */
  7. private static String getData(String res, String contentType) {
  8. BufferedReader reqbuf = null;
  9. JSONObject jsonObject = new JSONObject();
  10. try {
  11. final int NONE = 0; // 状态码,表示没有特殊操作
  12. final int DATAHEADER = 1; // 表示下一行要读到报头信息
  13. final int FIELDDATA = 2; // 表示下面要读到表单域的文本值
  14. String fieldname = ""; // 表单域的名称
  15. String fieldvalue = ""; // 表单域的值
  16. String boundary = ""; // 分界符字符串
  17. String lastboundary = ""; // 结束分界符字符串
  18. int pos = contentType.indexOf("boundary=");
  19. if (pos != -1) {
  20. pos += "boundary=".length();
  21. boundary = "--" + contentType.substring(pos); // 解析出分界符
  22. lastboundary = boundary + "--"; // 得到结束分界符
  23. }
  24. // 起始状态为NONE
  25. int state = NONE;
  26. // 从字符串中得到输出缓冲流
  27. reqbuf = new BufferedReader(new StringReader(res));
  28. while (true) {
  29. //读一行
  30. String s = reqbuf.readLine();
  31. //如果读到结束标志
  32. if (s == lastboundary || s == null) {
  33. break;
  34. }
  35. switch (state) {
  36. case NONE:
  37. if ((s.startsWith(boundary))) {
  38. // 如果读到分界符,则表示下一行一个头信息
  39. state = DATAHEADER;
  40. }
  41. break;
  42. case DATAHEADER:
  43. pos = s.indexOf("name=");
  44. if(pos != -1){
  45. pos += "name=".length() + 1; // 1表示后面的"的占位(引号的占位)
  46. s = s.substring(pos, s.length() - 1);
  47. fieldname = s; // 表单域的名称放入fieldname
  48. state = FIELDDATA; // 设置状态码,准备读取表单域的值
  49. }
  50. break;
  51. case FIELDDATA:
  52. // 读取表单域的值,再次读取,因为中间有空行
  53. s = reqbuf.readLine();
  54. fieldvalue = s; // 存入fieldvalue
  55. jsonObject.put(fieldname, fieldvalue);
  56. state = NONE;
  57. break;
  58. }
  59. }
  60. } catch (IOException e) {
  61. log.error("解析异常", e);
  62. } finally {
  63. try {
  64. reqbuf.close();
  65. } catch (IOException e) {
  66. log.error("关闭异常", e);
  67. }
  68. }
  69. return jsonObject.toJSONString();
  70. }

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,971人围观)

还没有评论,来说两句吧...

相关阅读