java獲取GET和POST請求引數
一 獲取請求方式
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都可用,
五 獲取取引數請求集合
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請求要根據<form>表單提交資料的編碼方式來確定能否使用.
當編碼方式是(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格式的報文方法,
示例報文如下:
解析:(利用upload方式解析的可以忽略)
/**
* 解析multipart/form-data
* @param res 這是通過request.getInputStream()都出來的報文
* @param contentType multipart/form-data
* @return 解析multipart/form-data格式提交過來的的流,轉成json,這裡忽略了報文中的“檔案”部分,只解析“文字”欄位
*/
private static String getData(String res, String contentType) {
BufferedReader reqbuf = null;
JSONObject jsonObject = new JSONObject();
try {
final int NONE = 0; // 狀態碼,表示沒有特殊操作
final int DATAHEADER = 1; // 表示下一行要讀到報頭資訊
final int FIELDDATA = 2; // 表示下面要讀到表單域的文字值
String fieldname = ""; // 表單域的名稱
String fieldvalue = ""; // 表單域的值
String boundary = ""; // 分界符字串
String lastboundary = ""; // 結束分界符字串
int pos = contentType.indexOf("boundary=");
if (pos != -1) {
pos += "boundary=".length();
boundary = "--" + contentType.substring(pos); // 解析出分界符
lastboundary = boundary + "--"; // 得到結束分界符
}
// 起始狀態為NONE
int state = NONE;
// 從字串中得到輸出緩衝流
reqbuf = new BufferedReader(new StringReader(res));
while (true) {
//讀一行
String s = reqbuf.readLine();
//如果讀到結束標誌
if (s == lastboundary || s == null) {
break;
}
switch (state) {
case NONE:
if ((s.startsWith(boundary))) {
// 如果讀到分界符,則表示下一行一個頭資訊
state = DATAHEADER;
}
break;
case DATAHEADER:
pos = s.indexOf("name=");
if(pos != -1){
pos += "name=".length() + 1; // 1表示後面的"的佔位(引號的佔位)
s = s.substring(pos, s.length() - 1);
fieldname = s; // 表單域的名稱放入fieldname
state = FIELDDATA; // 設定狀態碼,準備讀取表單域的值
}
break;
case FIELDDATA:
// 讀取表單域的值,再次讀取,因為中間有空行
s = reqbuf.readLine();
fieldvalue = s; // 存入fieldvalue
jsonObject.put(fieldname, fieldvalue);
state = NONE;
break;
}
}
} catch (IOException e) {
log.error("解析異常", e);
} finally {
try {
reqbuf.close();
} catch (IOException e) {
log.error("關閉異常", e);
}
}
return jsonObject.toJSONString();
}