JAVA获取GET和POST请求参数

简介: 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();
}


相关文章
|
1月前
|
XML JSON Java
Java实现post请求1688商品详情数据接口
Java实现post请求1688商品详情数据接口
69 0
|
1月前
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
|
1月前
|
监控 IDE Java
Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题
Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题
56 0
|
23小时前
|
Java
java使用Supplier接口的get生产一个数据
java使用Supplier接口的get生产一个数据
3 0
|
7天前
|
存储 Java
惊呆了!这些Java List竟然藏着这么多秘密!你get到了吗?
【6月更文挑战第17天】Java中的ArrayList在添加元素时自动扩容,容量翻倍以适应增长;LinkedList则利用双向链表结构提供高效头尾操作。迭代List时,并发修改会导致`ConcurrentModificationException`,需用Iterator或并发集合如CopyOnWriteArrayList。了解这些秘密能优化性能并避免异常。
|
18天前
|
JSON 安全 Java
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
20 0
|
1月前
|
Java
Java编写Http的Get和Post请求示例代码
Java编写Http的Get和Post请求示例代码
44 2
java post/get 重定向问题
• java重定向 • 重定向get请求 • 重定向post请求
|
3天前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
|
1天前
|
Java
Java中的`synchronized`关键字是一个用于并发控制的关键字,它提供了一种简单的加锁机制来确保多线程环境下的数据一致性。
【6月更文挑战第24天】Java的`synchronized`关键字确保多线程数据一致性,通过锁定代码块或方法防止并发冲突。同步方法整个方法体为临界区,同步代码块则锁定特定对象。示例展示了如何在`Counter`类中使用`synchronized`保证原子操作和可见性,同时指出过度使用可能影响性能。
10 4