天天看點

spring MVC 擷取請求體

在spring mvc中如何擷取請求要素呢?

通過如下方法:

spring MVC 擷取請求體

/** 

     * compatible with get and post 

     *  

     * @param request 

     * @return : <code>string</code> 

     * @throws ioexception 

     */  

    public static string getrequestquerystr(httpservletrequest request,  

            string charencoding) throws ioexception {  

        string submitmehtod = request.getmethod();  

        if (submitmehtod.equalsignorecase("post")) {  

            byte[] bytes = getrequestpostbytes(request);  

            string charencoding2 = request.getcharacterencoding();// charset  

            system.out.println("[getrequestquerystr]charencoding:"  

                    + charencoding2);  

            system.out.println("[getrequestquerystr]content-type:"  

                    + request.getheader(constant2.request_header_content_type));  

            if(valuewidget.isnullorempty(charencoding)){  

                charencoding=systemhwutil.charset_utf;  

            }  

            return new string(bytes, charencoding);  

        } else {// form method :get  

            return request.getquerystring();  

        }  

    }  

 對get請求的參數是沒有問題的,但是對于post請求擷取不到為什麼呢?

因為spring mvc已經擷取了一遍request的stream,是以再次擷取時是為空的,(這是輸入流的特性,可以查查官網api),是以我擷取到request 的inputstream之後調用reset,但是報錯,不支援reset操作.

怎麼辦呢?

在spring mvc 的控制器中使用@requestbody 注解,作用是擷取請求體,格式是位元組數組,見代碼

spring MVC 擷取請求體

@responsebody  

    @requestmapping(value = "/jsonstub", produces = systemhwutil.response_contenttype_json_utf)  

    public string json(model model, httpsession session,@requestbody byte[]bytes,  

            httpservletrequest request, string callback) throws ioexception {  

        map map=webservletutil.parserequest(request, null);  

        if(valuewidget.isnullorempty(map)){  

            string poststr=new string(bytes,systemhwutil.curr_encoding);//username=huangwei&password=123  

            system.out.println("poststr:"+poststr);//username=%e9%bb%84%e5%a8%81&password=123  

            poststr=urldecoder.decode(poststr,systemhwutil.curr_encoding);//{"username":"黃威","password":"123"}  

            map=webservletutil.parserequeststr(poststr, true);  

        string content = hwutils.getjsonp(map, callback);  

        return content;  

@requestbody後緊跟的參數将被注入請求體的位元組數組(spring mvc幫我們完成的).

注意:request.getinputstream() 讀取一次之後,再次讀取就讀取不到

上述代碼依賴的方法:

spring MVC 擷取請求體

/*** 

     * get request query string, form method : post 

     * @return byte[] 

    public static byte[] getrequestpostbytes(httpservletrequest request)  

            throws ioexception {  

        int contentlength = request.getcontentlength();  

        /*當無請求參數時,request.getcontentlength()傳回-1 */  

        if(contentlength<0){  

            return null;  

        byte buffer[] = new byte[contentlength];  

        for (int i = 0; i < contentlength;) {  

            int readlen = request.getinputstream().read(buffer, i,  

                    contentlength - i);  

            if (readlen == -1) {  

                break;  

            i += readlen;  

        return buffer;  

    /*** 

     * @return 

    public static string getrequestpoststr(httpservletrequest request)  

        byte buffer[] = getrequestpostbytes(request);  

        string charencoding = request.getcharacterencoding();  

        if (charencoding == null) {  

            charencoding = "utf-8";  

        return new string(buffer, charencoding);  

參考:http://json20080301.iteye.com/blog/1874074?utm_source=tuicool