1. 程式人生 > >Java Post 資料請求和接收

Java Post 資料請求和接收

      這兩天在做http服務端請求操作,客戶端post資料到服務端後,服務端通過request.getParameter()進行請求,無法讀取到資料,搜尋了一下發現是因為設定為text/plain模式才導致讀取不到資料

   urlConn.setRequestProperty("Content-Type","text/plain; charset=utf-8");
      若設定為以下方式,則通過request.getParameter()可以讀取到資料
   urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
  •  enctype的三種編碼

        form表單中enctype屬性可以用來控制對錶單資料的傳送前的如何進行編碼,即在傳送到伺服器之前,所有字元都會進行編碼(空格轉換為 "+" 加號,特殊符號轉換為 ASCII HEX 值)。預設是application/x-www-form-urlencoded。

        multipart/form-data用於傳送二進位制的檔案,其他兩種型別不能用於傳送檔案

      text/plain用於傳送純文字內容,不對特殊字元進行編碼,一般用於email之類的。

        application/x-www-form-urlencoded

text/plain的區別簡單講就是一個傳送html內容,一個傳送純文字內容

  1. application/x-www-form-urlencoded    在傳送前編碼所有字元(預設)
  2. multipart/form-data    不對字元編碼。在使用包含檔案上傳控制元件的表單時,必須使用該值。
  3. text/plain    空格轉換為 "+" 加號,但不對特殊字元編碼。
  • 當定義enctype為application/x-www-form-urlencoded時,使用以下方式接收資料
       request.getParameter(引數名);
  • 當定義enctype為text/plain時,使用以下方式接收資料
        // 接收請求資料
        BufferedReader reader = request.getReader();
        char[] buf = new char[512];
        int len = 0;
        StringBuffer contentBuffer = new StringBuffer();
        while ((len = reader.read(buf)) != -1) {
            contentBuffer.append(buf, 0, len);
        }
        String content = contentBuffer.toString();
        
        if(content == null){
            content = "";
        }
  •   post 與get

               post和get可以通過鍵值對的方式進行引數傳輸,服務端通過request.getparameter方式進行請求獲取資料。

  • 客戶端post資料到服務端,服務端接收處理
public class UrlConnection {    
    @SuppressWarnings("finally")
    public static boolean response(String url,String content) {
        String line         = "";
        String message        = "";
        String returnData   = "";
        boolean postState     = false;
        BufferedReader bufferedReader = null;
        
        try {
            URL urlObject = new URL(url);
            HttpURLConnection urlConn = (HttpURLConnection) urlObject.openConnection();
            urlConn.setDoOutput(true);
            /*設定禁用快取*/
            urlConn.setRequestProperty("Pragma:", "no-cache");      
            urlConn.setRequestProperty("Cache-Control", "no-cache");
            /*維持長連線*/
            urlConn.setRequestProperty("Connection", "Keep-Alive");  
            /*設定字符集*/
            urlConn.setRequestProperty("Charset", "UTF-8");
            /*設定輸出格式為json*/
            urlConn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
            /*設定使用POST的方式傳送*/
            urlConn.setRequestMethod("POST");             
            /*設定不使用快取*/
            urlConn.setUseCaches(false);
            /*設定容許輸出*/
            urlConn.setDoOutput(true);  
            /*設定容許輸入*/
            urlConn.setDoInput(true);              
            urlConn.connect();
            
            OutputStreamWriter outStreamWriter = new OutputStreamWriter(urlConn.getOutputStream(),"UTF-8"); 
            outStreamWriter.write(content);
            outStreamWriter.flush();
            outStreamWriter.close();
            
            /*若post失敗*/
            if((urlConn.getResponseCode() != 200)){
                returnData = "{\"jsonStrStatus\":0,\"processResults\":[]}";
                message = "傳送POST失敗!"+ "code="+urlConn.getResponseCode() + "," + "失敗訊息:"+ urlConn.getResponseMessage();
                // 定義BufferedReader輸入流來讀取URL的響應
                InputStream errorStream = urlConn.getErrorStream(); 
                
                if(errorStream != null)
                {
                    InputStreamReader inputStreamReader = new InputStreamReader(errorStream,"utf-8");
                    bufferedReader = new BufferedReader(inputStreamReader);  
              
                    while ((line = bufferedReader.readLine()) != null) {  
                        message += line;    
                    }         
                    inputStreamReader.close();
                }
                errorStream.close();
                System.out.println("傳送失敗!錯誤資訊為:"+message);                  
            }else{
                /*傳送成功返回傳送成功狀態*/
                postState = true;
                
                // 定義BufferedReader輸入流來讀取URL的響應
                InputStream inputStream = urlConn.getInputStream();  
                
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"utf-8");
                bufferedReader = new BufferedReader(inputStreamReader);  
          
                while ((line = bufferedReader.readLine()) != null) {  
                    message += line;  
                }        
                returnData = message;
                inputStream.close();
                inputStreamReader.close();
                
                System.out.println("傳送POST成功!返回內容為:" + message);                        
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {   
                if (bufferedReader != null) {  
                    bufferedReader.close();  
                }                  
            } catch (IOException ex) {  
                ex.printStackTrace();  
            }          
            return postState;
        }
    }
    
    /*讀取request資料*/
    public static String getRequestData(HttpServletRequest request) throws IOException{
        BufferedReader reader = request.getReader();
        char[] buf = new char[512];
        int len = 0;
        StringBuffer contentBuffer = new StringBuffer();
        while ((len = reader.read(buf)) != -1) {
            contentBuffer.append(buf, 0, len);
        }
        
        String content = contentBuffer.toString();
        
        if(content == null){
            content = "";
        }
        
        return content;
    }
}