【聲明】 html
歡迎轉載,但請保留文章原始出處→_→ java
生命壹號:http://www.cnblogs.com/smyhvae/android
文章來源:http://www.cnblogs.com/smyhvae/p/4006009.htmlweb
【系列】Android系列之網絡:(持續更新)apache
Android系列之網絡(一)----使用HttpClient發送HTTP請求(經過get方法獲取數據)瀏覽器
Android系列之網絡(二)----HTTP請求頭與響應頭tomcat
Android系列之網絡(三)----使用HttpClient發送HTTP請求(分別經過GET和POST方法發送數據)安全
Android系列之網絡(四)----SAX方式解析XML數據服務器
【正文】網絡
在前兩篇文章中,咱們學習到了和HTTP相關的基礎知識。文章連接以下:
Android系列之網絡(一)----使用HttpClient發送HTTP請求(經過get方法獲取數據)
Android系列之網絡(二)----HTTP請求頭與響應頭
1、GET和POST的對比:
在漫長的時間當中,其餘的方法逐漸的退出了歷史舞臺,最經常使用的只剩下GET和POST方法。而以前已經講過了經過GET方法獲取數據,今天來學習一下如何分別經過GET和POST獲取數據。
舉個例子:get相似於明信片,只有請求頭,沒有請求體。而post相似於一封信,信封上的內容爲請求頭;信裏面的內容爲請求體(請求頭和請求體是分開的)。
含義以下:
主要區別以下:
老羅在將到get和post請求的時候, 是這樣說的:
囉嗦了這麼多,對這段來個總結吧。
【總結】
get/post請求的區別:
注:GET請求方式和POST請求區別在於請求參數在傳遞的過程當中方式不一樣。
2、URL的定義和組成:
URL:Uniform Resource Locator 統一資源定位符
URL的組成部分:以http://www.mbalib.com/china/index.htm爲例
3、使用tomcat軟件在本地搭建服務器:
有了這個服務器,就至關於在本地的計算機有了一個網站,而後咱們能夠經過瀏覽器來訪問這個網站。
tomcat軟甲是apache旗下的一個開源項目。軟件下載連接:http://tomcat.apache.org/
下載以後,將壓縮包解壓:
注意目錄名不能有中文和空格。
軟件運行以前要保證環境變量已經配置:
上圖中,變量名爲JAVA_HOME,變量值爲:JDK安裝的絕對路徑。
回到tomcat的bin目錄中, 雙擊startup.bat:
以後彈出以下界面:
這個時候,本地的服務器就已經搭建起來了。
首先查看本身電腦的ip地址,個人計算機的ip地址爲:192.168.1.112。
在瀏覽器中輸入http://192.168.1.112:8080/。若是彈出以下界面,表示tomcat安裝成功而且啓動起來了:
上方圖片中,顯示個人Tomcat的版本爲:8.0.14。它的版本號是跟着JDK的版本走的,因此,建議JDK的版本爲1.8。
咱們如今在瀏覽器上測試一下它吧:
首先在D:\apache-tomcat-8.0.14\webapps\ROOT目錄中新建一個jsp文件:
jsp文件中填入以下內容:
<% String name = request.getParameter("name"); String pwd = request.getParameter("password"); out.print("name:" + name + ",password:" + pwd); //在瀏覽器上顯示輸入地址中的用戶名與密碼 %>
如今咱們隨便起一個用戶名和密碼的帳號,好比用戶名smyhvae,密碼爲smyh,而後在瀏覽器中輸入以下內容:
http://192.168.1.112:8080/test.jsp?name=smyhvae&password=smyh
輸入這個連接以後,回車,出現以下界面:
上圖中表示,咱們向服務器發送這樣一個請求,連接中,問號前面的內容表明請求的路徑,問號後面是咱們要傳送的參數(鍵是固定不變的,值是用戶本身填寫的),而後服務器返還給咱們這樣的數據。
4、使用GET方法向服務器發送數據:
咱們在博客「Android系列之網絡(一)」中其實就已經經過GET方法向服務器獲取數據了,只不過那篇文章中是訪問百度首頁,而後獲取百度首頁的數據。如今咱們要經過一樣的GET方法,只不過是換成了獲取本地服務器搭建的網站數據。
只須要稍微修改一下那篇文章中的代碼(代碼結構同樣,只是換了另一個連接)。完整版代碼以下:
activity_main.xml:
<LinearLayout 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" android:orientation="vertical" tools:context=".MainActivity" > <EditText android:id="@+id/nameText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="username" /> <EditText android:id="@+id/pwdText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="password" /> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="submit" /> </LinearLayout>
MainActivity.java的代碼以下:
1 package com.example.m04_http02; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.util.ArrayList; 6 import org.apache.http.HttpEntity; 7 import org.apache.http.HttpResponse; 8 import org.apache.http.NameValuePair; 9 import org.apache.http.client.HttpClient; 10 import org.apache.http.client.entity.UrlEncodedFormEntity; 11 import org.apache.http.client.methods.HttpGet; 12 import org.apache.http.client.methods.HttpPost; 13 import org.apache.http.impl.client.DefaultHttpClient; 14 import org.apache.http.message.BasicNameValuePair; 15 16 import android.app.Activity; 17 import android.os.Bundle; 18 import android.util.Log; 19 import android.view.View; 20 import android.view.View.OnClickListener; 21 import android.widget.Button; 22 import android.widget.EditText; 23 24 public class MainActivity extends Activity { 25 26 private EditText nameText; 27 private EditText pwdText; 28 private Button button; 29 30 @Override 31 protected void onCreate(Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 setContentView(R.layout.activity_main); 34 nameText = (EditText) findViewById(R.id.nameText); 35 pwdText = (EditText) findViewById(R.id.pwdText); 36 button = (Button) findViewById(R.id.button1); 37 38 button.setOnClickListener(new OnClickListener() { 39 40 @Override 41 public void onClick(View v) { 42 // TODO Auto-generated method stub 43 // 用戶輸入用戶名密碼, 而後經過Get方法發送給本地服務器 44 String name = nameText.getText().toString(); 45 String pwd = pwdText.getText().toString(); 46 47 // 運行線程,使用GET方法向本地服務器發送數據 48 GetThread getThread = new GetThread(name, pwd); 49 getThread.start(); 50 } 51 }); 52 } 53 54 //子線程:經過GET方法向服務器發送用戶名、密碼的信息 55 class GetThread extends Thread { 56 57 String name; 58 String pwd; 59 60 public GetThread(String name, String pwd) { 61 this.name = name; 62 this.pwd = pwd; 63 } 64 65 @Override 66 public void run() { 67 //用HttpClient發送請求,分爲五步 68 //第一步:建立HttpClient對象 69 HttpClient httpClient = new DefaultHttpClient(); 70 //注意,下面這一行中,我以前把連接中的"test"誤寫成了"text",致使調BUG調了半天沒弄出來,真是浪費時間啊 71 String url = "http://192.168.1.112:8080/test.jsp?name=" + name+ "&password=" + pwd; 72 //第二步:建立表明請求的對象,參數是訪問的服務器地址 73 HttpGet httpGet = new HttpGet(url); 74 try { 75 //第三步:執行請求,獲取服務器發還的相應對象 76 HttpResponse response = httpClient.execute(httpGet); 77 //第四步:檢查相應的狀態是否正常:檢查狀態碼的值是200表示正常 78 if (response.getStatusLine().getStatusCode() == 200) { 79 //第五步:從相應對象當中取出數據,放到entity當中 80 HttpEntity entity = response.getEntity(); 81 BufferedReader reader = new BufferedReader( 82 new InputStreamReader(entity.getContent())); 83 String result = reader.readLine(); 84 Log.d("HTTP", "GET:" + result); 85 } 86 } catch (Exception e) { 87 e.printStackTrace(); 88 } 89 90 } 91 } 92 }
上方代碼中,第73行就是咱們所放入的url連接。運行程序後,輸入用戶名密碼,能夠看到在後臺打印出了咱們所輸入的用戶名和密碼:
5、使用POST方法向服務器發送數據:
上一段中,咱們是經過GET方法向服務器發送數據,如今經過POST方法向服務器發送數據。佈局文件的代碼不變,就不寫了。MainActivity.java的代碼以下:
1 package com.example.m04_http02; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.util.ArrayList; 6 7 import org.apache.http.HttpEntity; 8 import org.apache.http.HttpResponse; 9 import org.apache.http.NameValuePair; 10 import org.apache.http.client.HttpClient; 11 import org.apache.http.client.entity.UrlEncodedFormEntity; 12 import org.apache.http.client.methods.HttpGet; 13 import org.apache.http.client.methods.HttpPost; 14 import org.apache.http.impl.client.DefaultHttpClient; 15 import org.apache.http.message.BasicNameValuePair; 16 17 import android.app.Activity; 18 import android.os.Bundle; 19 import android.util.Log; 20 import android.view.View; 21 import android.view.View.OnClickListener; 22 import android.widget.Button; 23 import android.widget.EditText; 24 25 public class MainActivity extends Activity { 26 27 private EditText nameText; 28 private EditText pwdText; 29 private Button button; 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 nameText = (EditText) findViewById(R.id.nameText); 36 pwdText = (EditText) findViewById(R.id.pwdText); 37 button = (Button) findViewById(R.id.button1); 38 39 button.setOnClickListener(new OnClickListener() { 40 41 @Override 42 public void onClick(View v) { 43 // TODO Auto-generated method stub 44 // 用戶輸入用戶名密碼, 而後經過Get方法發送給本地服務器 45 String name = nameText.getText().toString(); 46 String pwd = pwdText.getText().toString(); 47 48 // 使用GET方法向本地服務器發送數據 49 //GetThread getThread = new GetThread(name, pwd); 50 //getThread.start(); 51 52 //使用POST方法向服務器發送數據 53 PostThread postThread = new PostThread(name, pwd); 54 postThread.start(); 55 } 56 }); 57 } 58 59 60 //子線程:經過GET方法向服務器發送用戶名、密碼的信息 61 class GetThread extends Thread { 62 63 String name; 64 String pwd; 65 66 public GetThread(String name, String pwd) { 67 this.name = name; 68 this.pwd = pwd; 69 } 70 71 @Override 72 public void run() { 73 //用HttpClient發送請求,分爲五步 74 //第一步:建立HttpClient對象 75 HttpClient httpClient = new DefaultHttpClient(); 76 //注意,下面這一行中,我以前把連接中的"test"誤寫成了"text",致使調BUG調了半天沒弄出來,真是浪費時間啊 77 String url = "http://192.168.1.112:8080/test.jsp?name=" + name+ "&password=" + pwd; 78 //第二步:建立表明請求的對象,參數是訪問的服務器地址 79 HttpGet httpGet = new HttpGet(url); 80 try { 81 //第三步:執行請求,獲取服務器發還的相應對象 82 HttpResponse response = httpClient.execute(httpGet); 83 //第四步:檢查相應的狀態是否正常:檢查狀態碼的值是200表示正常 84 if (response.getStatusLine().getStatusCode() == 200) { 85 //第五步:從相應對象當中取出數據,放到entity當中 86 HttpEntity entity = response.getEntity(); 87 BufferedReader reader = new BufferedReader( 88 new InputStreamReader(entity.getContent())); 89 String result = reader.readLine(); 90 Log.d("HTTP", "GET:" + result); 91 } 92 } catch (Exception e) { 93 e.printStackTrace(); 94 } 95 96 } 97 } 98 99 //子線程:使用POST方法向服務器發送用戶名、密碼等數據 100 class PostThread extends Thread { 101 102 String name; 103 String pwd; 104 105 public PostThread(String name, String pwd) { 106 this.name = name; 107 this.pwd = pwd; 108 } 109 110 @Override 111 public void run() { 112 HttpClient httpClient = new DefaultHttpClient(); 113 String url = "http://192.168.1.112:8080/test.jsp"; 114 //第二步:生成使用POST方法的請求對象 115 HttpPost httpPost = new HttpPost(url); 116 //NameValuePair對象表明了一個須要發往服務器的鍵值對 117 NameValuePair pair1 = new BasicNameValuePair("name", name); 118 NameValuePair pair2 = new BasicNameValuePair("password", pwd); 119 //將準備好的鍵值對對象放置在一個List當中 120 ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>(); 121 pairs.add(pair1); 122 pairs.add(pair2); 123 try { 124 //建立表明請求體的對象(注意,是請求體) 125 HttpEntity requestEntity = new UrlEncodedFormEntity(pairs); 126 //將請求體放置在請求對象當中 127 httpPost.setEntity(requestEntity); 128 //執行請求對象 129 try { 130 //第三步:執行請求對象,獲取服務器發還的相應對象 131 HttpResponse response = httpClient.execute(httpPost); 132 //第四步:檢查相應的狀態是否正常:檢查狀態碼的值是200表示正常 133 if (response.getStatusLine().getStatusCode() == 200) { 134 //第五步:從相應對象當中取出數據,放到entity當中 135 HttpEntity entity = response.getEntity(); 136 BufferedReader reader = new BufferedReader( 137 new InputStreamReader(entity.getContent())); 138 String result = reader.readLine(); 139 Log.d("HTTP", "POST:" + result); 140 } 141 } catch (Exception e) { 142 e.printStackTrace(); 143 } 144 } catch (Exception e) { 145 e.printStackTrace(); 146 } 147 } 148 } 149 150 151 }
上方代碼中,咱們新開一個子線程,使用POST方法向服務器發送用戶名、密碼等數據。咱們以前已經知道,使用GET方法發送HTTP請求有五大步驟,而現在換成POST方法時,須要在第二步和第三步之間加入一些步驟(即上方加粗部分的代碼:116-127行),多的步驟實際上是往請求對象中加入請求體。如今來詳細解釋一下這部分代碼:
咱們經過NameValuePair集合來存放待提交的參數,並將這個參數集合傳入到一個UrlEncodedFormEntity當中(這個類的對象就表明了一個請求體,即鍵值對),而後將請求體放置在請求對象httpPost當中。
程序運行後,輸入用戶名和密碼,點擊按鈕,在後臺打印出了以前輸入的用戶名密碼:
如今咱們總結一下POST提交數據的步驟:
上面兩段的例子,都是經過GET和POST往服務器發送數據(在此,兩者的做用是等價的)。須要注意的是,通常來說,GET是從服務器取數據,但在此例子中GET倒是往服務器發數據。若是是上傳文件,就必須用POST。咱們將在從此的章節中講到。
【工程文件】
連接:http://pan.baidu.com/s/1euPiQ
密碼:00y6