1. 程式人生 > >java獲取GET和POST請求引數

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都可用,

注:不適用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請求要根據<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();
    }