1. 程式人生 > >AndroidStudio網路請求——Get請求&Post請求

AndroidStudio網路請求——Get請求&Post請求

1.URL請求的類別:
分為二類,GET與POST請求。
二者的區別在於:
1:) get請求可以獲取靜態頁面,也可以把引數放在URL字串後面,傳遞給servlet,
2:) post與get的不同之處在於post的引數不是放在URL字串裡面,而是放在http請求的正文內。

這裡寫圖片描述

[協議://] <域名|IP地址>[: 埠號] [/資源相對路徑][?引數名=引數值][&引數名=引數值]……

Get請求:獲取資料時用。(URL的長度是有限制的)
區分是不是get請求,看?那一塊(在位址列看見?就是get請求)

Post請求:放置在HTML Header內提交,URL中看不到資料的內容,比get請求安全,並且不受URL長度的限制(增刪改查時用) 在位址列看不見

HttpActivity程式碼:

public class HttpActivity extends AppCompatActivity {
    private Button search;
    private Button search1;
    private TextView show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_http);
        search = (Button) findViewById(R.id.search);
        search1 = (Button) findViewById(R.id.search1);
        show = (TextView) findViewById(R.id.show);
        search.setOnClickListener(new
View.OnClickListener() { @Override public void onClick(View v) { //url是要訪問的地址 Android是一個單執行緒系統 //訪問執行緒不能寫在UI執行緒裡面 //cmd+ipconfig看自己的ip(192.168.1.31) 手機和電腦必須在同一個網段內 String url = "http://192.168.1.31:8080/HttpTest/index.jsp"
+ "?option=getUser&uName=jerehedu"; new MyGetJob().execute(url); } }); search1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] arg = new String[2]; arg[0] = "http://192.168.1.31:8080/HttpTest/index.jsp"; arg[1] = "option=getUser&uName=jerehedu"; new MyPostJob().execute(arg); } }); } public class MyPostJob extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { HttpURLConnection con = null; //拿資料 InputStream is = null; StringBuilder sbd = new StringBuilder(); try { //將url轉變為URL類物件 URL url = new URL(params[0]); //開啟URL連線 con = (HttpURLConnection) url.openConnection(); con.setConnectTimeout(5 * 1000); con.setReadTimeout(5 * 1000); // 設定請求的方法為"POST",預設是GET con.setRequestMethod("POST"); // 設定是否從httpUrlConnection讀入,預設情況下是true; con.setDoInput(true); // 設定是否向httpUrlConnection輸出,因為這個是post請求,引數要放在 // http正文內,因此需要設為true, 預設情況下是false; con.setDoOutput(true); // Post 請求不能使用快取 con.setUseCaches(false); //轉碼 防止亂碼 con.setRequestProperty("charset", "UTF-8"); // 窗體資料被編碼為 名稱/值對 標準編碼格式 con.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); //往後臺寫引數 第一個傳進來的是地址 //strings應該是這樣的樣式=>option=getUser&uName=jerehedu String strings = params[1]; OutputStream os = con.getOutputStream(); // 向物件輸出流寫出資料,這些資料將存到記憶體緩衝區中 os.write(strings.getBytes()); // 重新整理物件輸出流,將任何位元組都寫入潛在的流中(些處為ObjectOutputStream) os.flush(); // 關閉流物件。此時,不能再向物件輸出流寫入任何資料,先前寫入的資料存在於記憶體緩衝區中, // 在呼叫下邊的getInputStream()函式時才把準備好的http請求正式傳送到伺服器 os.close(); if (con.getResponseCode() == 200) { is = con.getInputStream(); int next = 0; byte[] b = new byte[1024]; while ((next = is.read(b)) > 0) { sbd.append(new String(b, 0, next)); } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (con != null) { con.disconnect(); } } return sbd.toString(); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); show.setText("POST請求結果" + s); } } /** * AsyncTask非同步任務類 * 非同步任務類的引數: * 非同步任務類的第一個引數會傳到doInBackground方法中 * 第三個引數 * #指定doInBackground方法的返回值 * #doInBackground方法的返回值會被onPostExecute接收 */ public class MyGetJob extends AsyncTask<String, Void, String> { //onPreExecute在主執行緒中執行命令 通常做進度條的初始化 @Override protected void onPreExecute() { super.onPreExecute(); } //doInBackground在子執行緒中執行命令(耗時操作寫在這裡) @Override protected String doInBackground(String... params) { //因為要拋異常 所以置為空 // HttpURLConnection用這個可以訪問網路 在清單檔案中開啟訪問網路的許可權 HttpURLConnection con = null; //流 InputStream is = null; StringBuilder sbd = new StringBuilder(); try { URL url = new URL(params[0]); con = (HttpURLConnection) url.openConnection(); //設定連線超時時間 con.setConnectTimeout(5 * 1000); //設定讀取超時時間 con.setReadTimeout(5 * 1000); /** * http響應碼 * 200:成功 404:未找到 500:發生錯誤 */ if (con.getResponseCode() == 200) { // 讀取網頁內容(字串流) is = con.getInputStream(); int next = 0; byte[] bt = new byte[1024]; while ((next = is.read(bt)) > 0) { sbd.append(new String(bt, 0, next)); } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { //關閉 is.close(); } catch (IOException e) { e.printStackTrace(); } } if (con != null) { //斷開連線 con.disconnect(); } } return sbd.toString(); } //執行完doInBackground後返回結果的位置 //String s是結果 對應doInBackground裡的第三個引數 //onPostExecute 在UI執行緒(主執行緒)中執行命令 @Override protected void onPostExecute(String s) { super.onPostExecute(s); //返回顯示結果 show.setText(s); } } }

activity_http 佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<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="com.example.dell.jreduch07.HttpActivity">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/ll1"
    android:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv"
        android:textSize="20sp"
        android:layout_weight="1"
        android:layout_marginLeft="5dp"
        android:text="姓名" />
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="5"
        android:hint="請輸入要查詢的姓名"
        android:id="@+id/et"/>
</LinearLayout>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/search"
        android:text="查詢(GET方式)"
        android:layout_below="@+id/ll1"
        android:layout_alignStart="@+id/search1" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/search1"
        android:text="查詢(POST方式)"
        android:layout_below="@+id/search"
        android:layout_centerHorizontal="true" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#b9e7e18e"
        android:layout_below="@+id/search1"
        android:id="@+id/show"
        android:layout_marginLeft="5dp"
        android:text="查詢結果"/>
</RelativeLayout>