JAVA获取GET和POST请求参数

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: JAVA获取GET和POST请求参数

HttpServletRequest 中的方法

  • 获取请求方式  request.getMethod();  
  • 获取请求类型 request.getContentType();  
  • 获取所有参数key request.getParameterNames();  
  • 获取参数值value request.getParameter("keyName");  
  • 获取取参数请求集合 request.getParameterMap();  
  • 获取文本流 request.getInputStream();
  • 获取URL request.getRequestURL()
  • 返回请求URL中的参数:  request.getQueryString()

request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。

GET 请求

由于GET 请求 参数是拼接在URL中的 因此可以通过 getQueryString 方法 获取到请求参数

StringqueryString=request.getQueryString();


POST 请求

由于POST的请求类型不同  可以通过 getContentType方法 获取请求类型

application/x-www-form-urlencoded

可以通过queryDataForParameterMap  方式 也可以通过 queryDataForParameter 方式获取请求参数

Map<String, String[]>paraMap=request.getParameterMap();
Enumeration<String>parameterNames=request.getParameterNames();


application/json

需要通过 request.getInputStream() 流获取请求参数

StringqueryString=IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);


multipart/form-data

需要通过 request.getInputStream() 流获取请求参数

但是multipart/form-data类型获取的流中会夹杂一些其他信息 因此需要将流进行处理才能得到请求参数

/*** 状态码,表示没有特殊操作*/privatestaticfinalintNONE=0;
/*** 表示下一行要读到报头信息*/privatestaticfinalintDATA_HEADER=1;
/*** 表示下面要读到表单域的文本值*/privatestaticfinalintFIELD_DATA=2;
/*** 请求类型*/publicstaticfinalStringMULTIPART_FORM_DATA="multipart/form-data";
publicstaticfinalStringAPPLICATION_JSON="application/json";
/*** 请求方式*/publicstaticfinalStringGET="GET";
/*** 解析 multipart/form-data* @param  request request * @param  contentType multipart/form-data * @return   解析multipart/form-data格式提交过来的的流,转成json,这里忽略了报文中的“文件”部分,只解析“文本”字段 */privatestaticStringprocessorRequestOfFormData(HttpServletRequestrequest, StringcontentType) {
BufferedReaderrequestBufferedReader=null;
JSONObjectjsonObject=newJSONObject();
try {
Stringres=IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);
// 表单域的名称StringfieldName="";
// 表单域的值StringfieldValue="";
// 分界符字符串Stringboundary="";
// 结束分界符字符串StringlastBoundary="";
intpos=contentType.indexOf("boundary=");
if (pos!=-1) {
pos+="boundary=".length();
// 解析出分界符boundary="--"+contentType.substring(pos);
// 得到结束分界符lastBoundary=boundary+"--";
        }
// 起始状态为NONEintstate=NONE;
// 从字符串中得到输出缓冲流requestBufferedReader=newBufferedReader(newStringReader(res));
while (true) {
//读一行Strings=requestBufferedReader.readLine();
//如果读到结束标志if (s==null||s.equals(lastBoundary)) {
break;
            }
switch (state) {
caseNONE:
if ((s.startsWith(boundary))) {
// 如果读到分界符,则表示下一行一个头信息state=DATA_HEADER;
                    }
break;
caseDATA_HEADER:
pos=s.indexOf("name=");
if (pos!=-1) {
// 1表示后面的"的占位(引号的占位)pos+="name=".length() +1;
s=s.substring(pos, s.length() -1);
// 表单域的名称放入fieldNamefieldName=s;
// 设置状态码,准备读取表单域的值state=FIELD_DATA;
                    }
break;
caseFIELD_DATA:
// 读取表单域的值,再次读取,因为中间有空行s=requestBufferedReader.readLine();
// 存入fieldValuefieldValue=s;
jsonObject.put(fieldName, fieldValue);
state=NONE;
break;
default:
break;
            }
        }
    } catch (Exceptione) {
log.error("processorRequestOfFormData error ", e);
    } finally {
try {
assertrequestBufferedReader!=null;
requestBufferedReader.close();
        } catch (Exceptione) {
log.error("processorRequestOfFormData close reader error ", e);
        }
    }
returnjsonObject.toJSONString();
}


相关文章
|
2月前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
38 2
|
7月前
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
580 1
|
3月前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
163 2
|
2月前
|
小程序 Java
小程序通过get请求提交数据到java后台
小程序通过get请求提交数据到java后台
33 0
|
4月前
|
JSON 前端开发 Java
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
【8月更文挑战第12天】SpringBootWeb极速入门-请求参数解析(02)
31 1
|
4月前
|
安全 Java 数据库连接
|
6月前
|
Java
java使用Supplier接口的get生产一个数据
java使用Supplier接口的get生产一个数据
|
6月前
|
存储 Java
惊呆了!这些Java List竟然藏着这么多秘密!你get到了吗?
【6月更文挑战第17天】Java中的ArrayList在添加元素时自动扩容,容量翻倍以适应增长;LinkedList则利用双向链表结构提供高效头尾操作。迭代List时,并发修改会导致`ConcurrentModificationException`,需用Iterator或并发集合如CopyOnWriteArrayList。了解这些秘密能优化性能并避免异常。
23 0
|
6月前
|
JSON 安全 Java
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
93 0
|
1天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
11 3