AndroidStudio網路請求——Get請求&Post請求
阿新 • • 發佈:2019-01-26
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>