1. 程式人生 > >使用HttpURLConnection採用Post方式請求資料

使用HttpURLConnection採用Post方式請求資料

1.      服務端

doPost(){

doGet(request,response);

}

2.      Post方式不在URL後面加資料,而是用流的方式傳遞;GET在URL後傳輸資料

3.      是否傳遞---請求頭:setRequestProperty();

MainActivity中:

public void doPost(View v) {
		final String userName = etUserName.getText().toString();
		final String password = etPassword.getText().toString();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				final String state = NetUtils.loginOfPost(userName, password);
				// 執行任務在主執行緒中
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						// 就是在主執行緒中操作
						Toast.makeText(MainActivity.this, state, 0).show();
					}
				});
			}
		}).start();
	}

loginOfPost方法:

	/**
	 * 使用post的方式登入
	 * @param userName
	 * @param password
	 * @return  
	 */
	public static String loginOfPost(String userName, String password) {
		HttpURLConnection conn = null;
		try {
			URL url = new URL("http://10.0.2.2:8080/ServerItheima28/servlet/LoginServlet");
			
			conn = (HttpURLConnection) url.openConnection();
			
			conn.setRequestMethod("POST");
			conn.setConnectTimeout(10000); // 連線的超時時間
			conn.setReadTimeout(5000); // 讀資料的超時時間
			conn.setDoOutput(true);	// 必須設定此方法, 允許輸出****** 預設情況下, 系統不允許向伺服器輸出內容
//			conn.setRequestProperty("Content-Length", 234);		// 設定請求頭訊息, 可以設定多個
			
			// post請求的引數
			String data = "username=" + userName + "&password=" + password;
			
			// 獲得一個輸出流, 用於向伺服器寫資料, 預設情況下, 系統不允許向伺服器輸出內容
			OutputStream out = conn.getOutputStream();	
			out.write(data.getBytes());
			out.flush();
			out.close();
			
			int responseCode = conn.getResponseCode();
			if(responseCode == 200) {
				InputStream is = conn.getInputStream();
				String state = getStringFromInputStream(is);
				return state;
			} else {
				Log.i(TAG, "訪問失敗: " + responseCode);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(conn != null) {
				conn.disconnect();
			}
		}
		return null;
	}

根據流返回一個字串資訊;
/**
	 * 根據流返回一個字串資訊
	 * @param is
	 * @return
	 * @throws IOException 
	 */
	private static String getStringFromInputStream(InputStream is) throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = -1;
		
		while((len = is.read(buffer)) != -1) {
			baos.write(buffer, 0, len);
		}
		is.close();
		
		String html = baos.toString();	// 把流中的資料轉換成字串, 採用的編碼是: utf-8
		
//		String html = new String(baos.toByteArray(), "GBK");
		
		baos.close();
		return html;
	}