Android網路編程之傳遞資料給伺服器(二)
Android網路編程之傳遞資料給伺服器(二)
請尊重他人的勞動成果,轉載請註明出處:Android網路編程之傳遞資料給伺服器(二)
我曾在《Android網路編程之傳遞資料給伺服器(一) 》 一文中介紹了如何通過GET方式傳遞資料給伺服器,通過GET方式傳遞資料主要適用於資料大小不超過2KB,且對安全性要求不高的情況下。下面就介紹通過POST方式傳遞資料主到伺服器。
一、通過Post方式傳遞資料給伺服器
通過Post方式傳遞資料給伺服器是Android應用程式開發提交資料給伺服器的一種主要的方式,適用於資料量大、資料類型複雜、資料安全性高的場合。
1.建立伺服器端:
伺服器端項目結構:
vc3S3vcq9tKu13cr9vt24+Lf+zvHG96Gqoaq3/s7xxve2y8/uxL+94bm5">
第一步:建立控制器Servlet
package com.jph.sp.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/ServletForPOSTMethod")public class ServletForPOSTMethod extends HttpServlet {private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String name= request.getParameter("name");String pwd= request.getParameter("pwd");System.out.println("name from POST method: " + name );System.out.println("pwd from POST method: " + pwd );}}
至此伺服器端項目已經完成。下面開始建立Android端項目。
2.建立Android端:
Android端項目結構:
第一步:建立Android端項目的商務邏輯層
核心代碼:SendDateToServer.java:
package com.jph.sp.service;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.HashMap;import java.util.Map;import android.os.Handler;/** * 通過POST方式向伺服器發送資料 * @author jph * Date:2014.09.27 */public class SendDateToServer {private static String url="http://10.219.61.117:8080/ServerForPOSTMethod/ServletForPOSTMethod";public static final int SEND_SUCCESS=0x123;public static final int SEND_FAIL=0x124;private Handler handler;public SendDateToServer(Handler handler) {// TODO Auto-generated constructor stubthis.handler=handler;}/** * 通過POST方式向伺服器發送資料 * @param name 使用者名稱 * @param pwd 密碼 */public void SendDataToServer(String name,String pwd) {// TODO Auto-generated method stubfinal Mapmap=new HashMap();map.put("name", name);map.put("pwd", pwd);new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry { if (sendPostRequest(map,url,"utf-8")) {handler.sendEmptyMessage(SEND_SUCCESS);//通知主線程資料發送成功}else {//將資料發送給伺服器失敗}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}/** * 發送POST請求 * @param map 請求參數 * @param url 請求路徑 * @return * @throws Exception */private boolean sendPostRequest(Map param, String url,String encoding) throws Exception {// TODO Auto-generated method stub//http://10.219.61.117:8080/ServerForPOSTMethod/ServletForPOSTMethod?name=aa&pwd=124StringBuffer sb=new StringBuffer(url);if (!url.equals("")&!param.isEmpty()) {sb.append("?");for (Map.Entryentry:param.entrySet()) {sb.append(entry.getKey()+"=");sb.append(URLEncoder.encode(entry.getValue(), encoding));sb.append("&");}sb.deleteCharAt(sb.length()-1);//刪除字串最後 一個字元“&”}byte[]data=sb.toString().getBytes();HttpURLConnection conn=(HttpURLConnection) new URL(url).openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("POST");//佈建要求方式為POSTconn.setDoOutput(true);//允許對外傳輸資料conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 設定表單資料編碼為成對的名稱和數值conn.setRequestProperty("Content-Length", data.length+"");OutputStream outputStream=conn.getOutputStream();//開啟伺服器的輸入資料流outputStream.write(data);//將資料寫入到伺服器的輸出資料流outputStream.flush();if (conn.getResponseCode()==200) {return true;}return false;}}
第三步:建立Activity
package com.jph.sp.activity;import com.jph.sp.service.SendDateToServer;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;/** * 通過Post方式傳遞資料給伺服器是Android應用程式開發 * 提交資料給伺服器的一種主要的方式,適用於資料量大、 * 資料類型複雜、資料安全性高的場合。 * @author jph * Date:2014.09.27 */public class MainActivity extends Activity {private EditText edtName,edtPwd;private Button btnSend;Handler handler=new Handler(){public void handleMessage(Message msg) {switch (msg.what) {case SendDateToServer.SEND_SUCCESS:Toast.makeText(MainActivity.this, "登陸成功", Toast.LENGTH_SHORT).show();break;case SendDateToServer.SEND_FAIL:Toast.makeText(MainActivity.this, "登陸失敗", Toast.LENGTH_SHORT).show();break;default:break;}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);edtName=(EditText)findViewById(R.id.edtName);edtPwd=(EditText)findViewById(R.id.edtPwd);btnSend=(Button)findViewById(R.id.btnSend);btnSend.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString name=edtName.getText().toString();String pwd=edtPwd.getText().toString();if (edtName.equals("")||edtPwd.equals("")) {Toast.makeText(MainActivity.this, "使用者名稱或密碼不可為空", Toast.LENGTH_LONG).show();}else {new SendDateToServer(handler).SendDataToServer(name, pwd);}}});}}
至此Android端項目已經完成了。下面就讓我們看一下APP運行效果吧:
Android運行: