Android中使用HttpURLConnection和HttpClient實現GET和POST請求訪問網路
HttpURLConnection中的GET
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLEncoder;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Base64;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity { private EditText content; //聲明一個輸入常值內容的編輯框對象 private Button button; //聲明一個發表按鈕對象 private Handler handler; // 聲明一個Handler對象 private String result = ""; //聲明一個代表顯示內容的字串 private TextView resultTV; //聲明一個顯示結果的文字框對象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); content = (EditText) findViewById(R.id.content); //擷取輸入常值內容的EditText組件 resultTV = (TextView) findViewById(R.id.result); //擷取顯示結果的TextView組件 button = (Button) findViewById(R.id.button); //擷取“發表”按鈕組件 //為按鈕添加單擊事件監聽器 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if ("".equals(content.getText().toString())) { Toast.makeText(MainActivity.this, "請輸入要發表的內容!", Toast.LENGTH_SHORT).show(); //顯示訊息提示 return; } // 建立一個新線程,用於發送並讀取微博資訊 new Thread(new Runnable() { public void run() { send(); //發送常值內容到Web伺服器 Message m = handler.obtainMessage(); // 擷取一個Message handler.sendMessage(m); // 發送訊息 } }).start(); // 開啟線程 } }); //建立一個Handler對象 handler = new Handler() { @Override public void handleMessage(Message msg) { if (result != null) { resultTV.setText(result); // 顯示獲得的結果 content.setText(""); //清空文字框 } super.handleMessage(msg); } }; } public void send() { String target=""; target = "http://192.168.1.66:8081/blog/index.jsp?content=" +base64(content.getText().toString().trim()); //要訪問的URL地址 URL url; try { url = new URL(target); HttpURLConnection urlConn = (HttpURLConnection) url .openConnection(); //建立一個HTTP串連 InputStreamReader in = new InputStreamReader( urlConn.getInputStream()); // 獲得讀取的內容 BufferedReader buffer = new BufferedReader(in); // 擷取輸入資料流對象 String inputLine = null; //通過迴圈逐行讀取輸入資料流中的內容 while ((inputLine = buffer.readLine()) != null) { result += inputLine + "\n"; } in.close(); //關閉字元輸入資料流對象 urlConn.disconnect(); //中斷連線 } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //對字串進行Base64編碼 public String base64(String content){ try { content=Base64.encodeToString(content.getBytes("utf-8"), Base64.DEFAULT); //對字串進行Base64編碼 content=URLEncoder.encode(content); //對字串進行URL編碼 } catch (UnsupportedEncodingException e) { e.printStackTrace(); //輸出異常資訊 } return content; }}
HttpURLConnection中的POST
import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLEncoder;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity { private EditText nickname; // 聲明一個輸入暱稱的編輯框對象 private EditText content; // 聲明一個輸入常值內容的編輯框對象 private Button button; // 聲明一個發表按鈕對象 private Handler handler; // 聲明一個Handler對象 private String result = ""; // 聲明一個代表顯示內容的字串 private TextView resultTV; // 聲明一個顯示結果的文字框對象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); content = (EditText) findViewById(R.id.content); // 擷取輸入常值內容的EditText組件 resultTV = (TextView) findViewById(R.id.result); // 擷取顯示結果的TextView組件 nickname = (EditText) findViewById(R.id.nickname); // 擷取輸入暱稱的EditText組件 button = (Button) findViewById(R.id.button); // 擷取“發表”按鈕組件 // 為按鈕添加單擊事件監聽器 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if ("".equals(nickname.getText().toString()) || "".equals(content.getText().toString())) { Toast.makeText(MainActivity.this, "請將內容輸入完整!", Toast.LENGTH_SHORT).show(); return; } // 建立一個新線程,用於從網路上擷取檔案 new Thread(new Runnable() { public void run() { send(); Message m = handler.obtainMessage(); // 擷取一個Message handler.sendMessage(m); // 發送訊息 } }).start(); // 開啟線程 } }); handler = new Handler() { @Override public void handleMessage(Message msg) { if (result != null) { resultTV.setText(result); // 顯示獲得的結果 content.setText(""); // 清空內容編輯框 nickname.setText(""); // 清空暱稱編輯框 } super.handleMessage(msg); } }; } public void send() { String target = "http://192.168.1.66:8081/blog/dealPost.jsp"; //要提交的目標地址 URL url; try { url = new URL(target); HttpURLConnection urlConn = (HttpURLConnection) url .openConnection(); // 建立一個HTTP串連 urlConn.setRequestMethod("POST"); // 指定使用POST請求方式 urlConn.setDoInput(true); // 向串連中寫入資料 urlConn.setDoOutput(true); // 從串連中讀取資料 urlConn.setUseCaches(false); // 禁止緩衝 urlConn.setInstanceFollowRedirects(true); //自動執行HTTP重新導向 urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // 設定內容類型 DataOutputStream out = new DataOutputStream( urlConn.getOutputStream()); // 擷取輸出資料流 String param = "nickname=" + URLEncoder.encode(nickname.getText().toString(), "utf-8") + "&content=" + URLEncoder.encode(content.getText().toString(), "utf-8"); //串連要提交的資料 out.writeBytes(param);//將要傳遞的資料寫入資料輸出資料流 out.flush(); //輸出緩衝 out.close(); //關閉資料輸出資料流 // 判斷是否響應成功 if (urlConn.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStreamReader in = new InputStreamReader( urlConn.getInputStream()); // 獲得讀取的內容 BufferedReader buffer = new BufferedReader(in); // 擷取輸入資料流對象 String inputLine = null; while ((inputLine = buffer.readLine()) != null) { result += inputLine + "\n"; } in.close(); //關閉字元輸入資料流 } urlConn.disconnect(); //中斷連線 } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
HttpClient的GET
和HttpURLConnection中的Get上述代碼中唯一不同的是send方法;
public void send() { String target = "http://192.168.1.66:8081/blog/deal_httpclient.jsp?param=get"; //要提交的目標地址 HttpClient httpclient = new DefaultHttpClient();//建立HttpClient對象 HttpGet httpRequest = new HttpGet(target); //建立HttpGet連線物件 HttpResponse httpResponse; try { httpResponse = httpclient.execute(httpRequest); //執行HttpClient請求 if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ result = EntityUtils.toString(httpResponse.getEntity()); //擷取返回的字串 }else{ result="請求失敗!"; } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
HttpClient的POST
同樣的和HttpURLConnection中的Post不同的是send方法:
public void send() { String target = "http://192.168.1.66:8081/blog/deal_httpclient.jsp"; //要提交的目標地址 HttpClient httpclient = new DefaultHttpClient(); //建立HttpClient對象 HttpPost httpRequest = new HttpPost(target); //建立HttpPost對象 //將要傳遞的參數儲存到List集合中 List params = new ArrayList(); params.add(new BasicNameValuePair("param", "post")); //標記參數 params.add(new BasicNameValuePair("nickname", nickname.getText().toString())); //暱稱 params.add(new BasicNameValuePair("content", content.getText().toString())); //內容 try { httpRequest.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //設定編碼方式 HttpResponse httpResponse = httpclient.execute(httpRequest); //執行HttpClient請求 if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //如果請求成功 result += EntityUtils.toString(httpResponse.getEntity()); //擷取返回的字串 }else{ result = "請求失敗!"; } } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); //輸出異常資訊 } catch (ClientProtocolException e) { e.printStackTrace(); //輸出異常資訊 } catch (IOException e) { e.printStackTrace(); //輸出異常資訊 } }