Android應用經常會和服務器端交互,這就需要手機客戶端發送網絡請求,下面介紹常用的兩種網絡請求方式POST,GET。首先要區別POST和GET請求
1. GET是從服務器上獲取數據,POST是向服務器傳送數據。
2. GET是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。POST是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程
3. GET方式提交的數據最多只能是1024字節,理論上POST沒有限制,可傳較大量的數據
4. GET安全性非常低,POST安全性較高。但是執行效率卻比POST方法好。
下面分別用Post和GET方法來實現Android應用的人員登入,首先我們搭建一個服務器,這裡我使用WAMP環境,使用ThinkPHP框架。詳細的服務器搭建就不說了。給出主要響應代碼:
- namespace Home\Controller;
- use Think\Controller;
- class AndroidController extends Controller {
- public function index()
- {
- //獲取賬號密碼
- $id=I('username');
- $pwd=I('password');
- $User=M('user');
- //查詢數據庫
- $data = $User->where("NAME='$id' AND PASSWORD='$pwd' ")->find();
- //登入成功
- if($data)
- {
- $response = array('success' => true,'msg'=>'登入成功');
-
- $response=json_encode($response);
- echo $response;//返回json格式
- }
- //登入失敗
- else
- {
- $response = array('success' => false,'msg'=>'賬號或密碼錯誤');
- $response=json_encode($response);
- echo $response;//返回json格式
- }
- }
-
- } 復制代碼 記得添加網絡權限 Android的網絡請求主要使用java.net包中的HttpURLConnection類,服務器與Android客戶端數據交互格式為json 1.利用POST請求方式來實現人員登入。
- package com.dream.apm;
-
- import android.app.Activity;
- import android.content.pm.ActivityInfo;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.view.View;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.LinearLayout;
- import android.widget.Toast;
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
-
- import java.io.*;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.net.URLEncoder;
-
- public class MyActivity extends Activity {
-
- //請求地址
- private static String url="http://10.0.2.2:8080/think/index.php/Home/Android";
- public Button start;
-
- public EditText username,password;
-
- public URL http_url;
-
- public String data;
-
- public Handler handler;
-
- @Override
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- //設置全屏
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- //去除應用程序標題
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- //設置豎屏
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- setContentView(R.layout.main);
-
- start=(Button)findViewById(R.id.start_one);
- username=(EditText)findViewById(R.id.username);
- password=(EditText)findViewById(R.id.password);
- //消息處理器
-
- handler=new Handler(Looper.getMainLooper())
- {
- @Override
- public void handleMessage(Message msg)
- {
- super.handleMessage(msg);
- switch(msg.what)
- {
- //登入成功
- case 1:
- Toast.makeText(MyActivity.this, msg.getData().getString("msg"),
- Toast.LENGTH_SHORT).show();
- break;
- //登入失敗
- case 2:
- Toast.makeText(MyActivity.this, msg.getData().getString("msg"),
- Toast.LENGTH_SHORT).show();
- break;
-
- }
- }
- };
-
- start.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //是否輸入賬號密碼
- if(username.getText().toString().length()>0&&password.getText().toString().length()>0){
- //子線程可以獲取UI的值,不能更改
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- http_url=new URL(url);
- if(http_url!=null)
- {
- //打開一個HttpURLConnection連接
- HttpURLConnection conn = (HttpURLConnection) http_url.openConnection();
- conn.setConnectTimeout(5* 1000);//設置連接超時
- conn.setRequestMethod("POST");//以get方式發起請求
- //允許輸入輸出流
- conn.setDoInput(true);
- conn.setDoOutput(true);
- conn.setUseCaches(false);//使用Post方式不能使用緩存
- //獲取賬號密碼
- String params = "username=" + username.getText().toString()
- + "&password=" + password.getText().toString();
- //設置請求體的類型是文本類型
- conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
- //設置請求體的長度--字節長度
- conn.setRequestProperty("Content-Length",String.valueOf(params.getBytes().length) );
- //發送post參數
- BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
- bw.write(params);
- bw.close();
- //接收服務器響應
- if (conn.getResponseCode() == 200) {
- InputStream is = conn.getInputStream();//得到網絡返回的輸入流
- BufferedReader buf=new BufferedReader(new InputStreamReader(is));//轉化為字符緩沖流
- data=buf.readLine();
- buf.close();is.close();
- //判斷登入結果
- analyse(data);
- }
- }
- } catch( Exception e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
- else
- {
- Toast.makeText(MyActivity.this, "請完整輸入賬號密碼",
- Toast.LENGTH_SHORT).show();
- }
- }
- });
- }
-
- public void analyse (String data)
- {
- System.out.println(data);
- try {
- JSONObject json_data=new JSONObject(data);
- Boolean state=json_data.getBoolean("success");
- String msg=json_data.getString("msg");
- //登入成功
- if(state)
- {
- //發送消息
- Message message= new Message();
- message.what=1;
- Bundle temp = new Bundle();
- temp.putString("msg",msg);
- message.setData(temp);
- handler.sendMessage(message);
-
- }
- //登入失敗
- else
- {
- Message message= new Message();
- message.what=2;
- Bundle temp = new Bundle();
- temp.putString("msg",msg);
- message.setData(temp);
- handler.sendMessage(message);
- }
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- } 復制代碼 2.利用GET請求方式來實現人員登入
- package com.dream.apm;
-
- import android.app.Activity;
- import android.content.pm.ActivityInfo;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.view.View;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.LinearLayout;
- import android.widget.Toast;
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
-
- import java.io.*;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.net.URLEncoder;
-
- public class MyActivity extends Activity {
-
- public Button start;
-
- public EditText username,password;
-
- public URL http_url;
-
- public String data;
-
- public Handler handler;
-
- @Override
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- //設置全屏
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- //去除應用程序標題
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- //設置豎屏
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- setContentView(R.layout.main);
-
- start=(Button)findViewById(R.id.start_one);
- username=(EditText)findViewById(R.id.username);
- password=(EditText)findViewById(R.id.password);
- //消息處理器
-
- handler=new Handler(Looper.getMainLooper())
- {
- @Override
- public void handleMessage(Message msg)
- {
- super.handleMessage(msg);
- switch(msg.what)
- {
- //登入成功
- case 1:
- Toast.makeText(MyActivity.this, msg.getData().getString("msg"),
- Toast.LENGTH_SHORT).show();
- break;
- //登入失敗
- case 2:
- Toast.makeText(MyActivity.this, msg.getData().getString("msg"),
- Toast.LENGTH_SHORT).show();
- break;
-
- }
- }
- };
-
- start.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //是否輸入賬號密碼
- if(username.getText().toString().length()>0&&password.getText().toString().length()>0){
- //子線程可以獲取UI的值,不能更改
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- //請求地址--
- String url="http://10.0.2.2:8080/think/index.php/Home/Android?"+ "username=" + URLEncoder.encode(username.getText().toString(), "UTF-8")
- + "&password=" + URLEncoder.encode(password.getText().toString(), "UTF-8");
- http_url=new URL(url);
- if(http_url!=null)
- {
- //打開一個HttpURLConnection連接
- HttpURLConnection conn = (HttpURLConnection) http_url.openConnection();
- conn.setConnectTimeout(5* 1000);//設置連接超時
- conn.setRequestMethod("GET");//以get方式發起請求
- //允許輸入流
- conn.setDoInput(true);
- //接收服務器響應
- if (conn.getResponseCode() == 200) {
- InputStream is = conn.getInputStream();//得到網絡返回的輸入流
- BufferedReader buf=new BufferedReader(new InputStreamReader(is));//轉化為字符緩沖流
- data=buf.readLine();
- buf.close();is.close();
- //判斷登入結果
- analyse(data);
- }
- }
- } catch( Exception e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
- else
- {
- Toast.makeText(MyActivity.this, "請完整輸入賬號密碼",
- Toast.LENGTH_SHORT).show();
- }
- }
- });
- }
-
- public void analyse (String data)
- {
- System.out.println(data);
- try {
- JSONObject json_data=new JSONObject(data);
- Boolean state=json_data.getBoolean("success");
- String msg=json_data.getString("msg");
- //登入成功
- if(state)
- {
- //發送消息
- Message message= new Message();
- message.what=1;
- Bundle temp = new Bundle();
- temp.putString("msg",msg);
- message.setData(temp);
- handler.sendMessage(message);
-
- }
- //登入失敗
- else
- {
- Message message= new Message();
- message.what=2;
- Bundle temp = new Bundle();
- temp.putString("msg",msg);
- message.setData(temp);
- handler.sendMessage(message);
- }
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- } 復制代碼 運行結果: