Android 使用Post方式提交數據


      在Android中,提供了標准Java接口HttpURLConnection和Apache接口HttpClient,為客戶端HTTP編程提供了豐富的支持。

  在HTTP通信中使用最多的就是GET和POST了,GET請求可以獲取靜態頁面,也可以把參數放在URL字符串的后面,傳遞給服務器。POST與GET的不同之處在於POST的參數不是放在URL字符串里面,而是放在HTTP請求數據中。

  本文將使用標准Java接口HttpURLConnection,以一個實例演示如何使用POST方式向服務器提交數據,並將服務器的響應結果顯示在Android客戶端

1.Android中實現

activity_main.xml部分

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    
    <TextView
        android:id="@+id/lblPostResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/butPost"
        android:layout_centerHorizontal="true"
        android:text="提交結果" />
    
    <Button
        android:id="@+id/butPost"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="25dp"
        android:text="提交測試" />

</RelativeLayout>

//import部分

//import部分
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; 
import android.widget.Toast;
import android.util.Log;

import java.io.InputStream; 
import java.util.HashMap;   
import java.util.Map; 

import java.util.Date;
import java.text.SimpleDateFormat;

//public class MainActivity extends Activity  部分

private Button m_butPost;
m_butPost=(Button)findViewById(R.id.butPost);
m_butPost.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
    butPost_OnClick(v);
     }
});

//提交測試
private void butPost_OnClick(View v){
     //請求參數鍵-值對   
    String strRecSmsMsg="收短信測試";
     //提交
    RecSmsToPost(strRecSmsMsg);
    openToast("提交測試完成");
}
//收到短信 后 提交
private void RecSmsToPost(String strRecSmsMsg){
      String strNowDateTime=getNowDateTime("yyyy-MM-dd|HH:mm:ss");//當前時間
     //參數
     Map<String,String> params = new HashMap<String,String>();   
      params.put("RECSMSMSG", strRecSmsMsg);   
      //params.put("name", "李四"); 

      //服務器請求路徑     
     String strUrlPath = "http://192.168.1.9:80/JJKSms/RecSms.php" +"?DateTime=" + strNowDateTime; 
      String strResult=HttpUtils.submitPostData(strUrlPath,params, "utf-8");
        m_lblPostResult.setText(strResult);

         //openToast("提交完成");        
}

//獲取當前時間
private String getNowDateTime(String strFormat){
    if(strFormat==""){
            strFormat="yyyy-MM-dd HH:mm:ss";
     }
     Date now = new Date(); 
     SimpleDateFormat df = new SimpleDateFormat(strFormat);//設置日期格式 
     return df.format(now); // new Date()為獲取當前系統時間
}
    
//彈出消息
private void openToast(String strMsg){
    Toast.makeText(this, strMsg, Toast.LENGTH_LONG).show();        
}

 HttpUtils 類部分

 新建 類文件 HttpUtils 其中代碼如下:

import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream; 
import java.io.InputStream;
import java.util.Map;
import java.io.IOException;
import java.net.URLEncoder;
import java.io.ByteArrayOutputStream;

public class HttpUtils {
    /*
     * Function  :   發送Post請求到服務器
     * Param     :   params請求體內容,encode編碼格式
     */
    public static String submitPostData(String strUrlPath,Map<String, String> params, String encode) {
        
        byte[] data = getRequestData(params, encode).toString().getBytes();//獲得請求體
        try {            
            
            //String urlPath = "http://192.168.1.9:80/JJKSms/RecSms.php"; 
            URL url = new URL(strUrlPath);  
             
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setConnectTimeout(3000);     //設置連接超時時間
            httpURLConnection.setDoInput(true);                  //打開輸入流,以便從服務器獲取數據
            httpURLConnection.setDoOutput(true);                 //打開輸出流,以便向服務器提交數據
            httpURLConnection.setRequestMethod("POST");     //設置以Post方式提交數據
            httpURLConnection.setUseCaches(false);               //使用Post方式不能使用緩存
            //設置請求體的類型是文本類型
            httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            //設置請求體的長度
            httpURLConnection.setRequestProperty("Content-Length", String.valueOf(data.length));
            //獲得輸出流,向服務器寫入數據
            OutputStream outputStream = httpURLConnection.getOutputStream();
            outputStream.write(data);
            
            int response = httpURLConnection.getResponseCode();            //獲得服務器的響應碼
            if(response == HttpURLConnection.HTTP_OK) {
                InputStream inptStream = httpURLConnection.getInputStream();
                return dealResponseResult(inptStream);                     //處理服務器的響應結果
            }
        } catch (IOException e) {
            //e.printStackTrace();
            return "err: " + e.getMessage().toString();
        }
        return "-1";
    }
    
    /*
     * Function  :   封裝請求體信息
     * Param     :   params請求體內容,encode編碼格式
     */
   public static StringBuffer getRequestData(Map<String, String> params, String encode) {
      StringBuffer stringBuffer = new StringBuffer();        //存儲封裝好的請求體信息
      try {
            for(Map.Entry<String, String> entry : params.entrySet()) {
                stringBuffer.append(entry.getKey())
                      .append("=")
                      .append(URLEncoder.encode(entry.getValue(), encode))
                      .append("&");
            }
           stringBuffer.deleteCharAt(stringBuffer.length() - 1);    //刪除最后的一個"&"
        } catch (Exception e) {
           e.printStackTrace();
       }
       return stringBuffer;
    }
    
   /*
    * Function  :   處理服務器的響應結果(將輸入流轉化成字符串)
    * Param     :   inputStream服務器的響應輸入流
    */
   public static String dealResponseResult(InputStream inputStream) {
      String resultData = null;      //存儲處理結果
       ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
      byte[] data = new byte[1024];
      int len = 0;
       try {
          while((len = inputStream.read(data)) != -1) {
             byteArrayOutputStream.write(data, 0, len);
          }
     } catch (IOException e) {
         e.printStackTrace();
        }
       resultData = new String(byteArrayOutputStream.toByteArray());    
       return resultData;
   }    
    
   
}

 

2.服務器端的准備

  在服務器端我采用wamp方式,當然其它方式也可以。 創建RecSms.php 文件 內容如下:

<?php

require_once ('Log/LogHelper.php');

echo "你好" . "post </br>";

foreach($_REQUEST as $k=>$v){
    echo $k;echo "--";
    echo $v;echo "</br>";
}

WriteLog('你好 RecSms.php ---------');    
    
foreach($_POST as $k=>$v){    
    WriteLog( $k .'--' .$v);    
}    
foreach($_GET as $k=>$v){    
    WriteLog( $k .'--' .$v);    
}    
 
?>

將提交的數據寫入Log\Log.php文件中。

其中LogHelper.php 為寫日志文件,代碼文件如下:

<?php 

function WriteLog($msg){
    $fp = fopen("Log\Log.php", "a");//文件被清空后再寫入 
    if($fp) 
    { 
        date_default_timezone_set('asia/chongqing');
        $time=date("H:i:s",strtotime("now"));
        $flag=fwrite($fp, $time ."   ".$msg ."  \r\n"); 
        fclose($fp); 
    }
}
?>


 所有代碼已寫好。

 開啟 wamp ,在Android中點擊 提交測試 則 在Log.php文件寫入提交的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM