在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文件寫入提交的數據