Lập trình mạng trong Android bao gồm việc gửi yêu cầu và lấy dữ liệu từ máy chủ. Hôm nay, mình sẽ hướng dẫn các bạn gửi yêu cầu và lấy dữ liệu từ máy chủ bằng HttpPost. Để làm được việc này, các bạn thực hiện các bước sau :
Bước 1 : Thêm 2 permisson sau vào file mainifest
<uses-permission android:name=“android.permission.INTERNET”/>
<uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE”/>
Permission INTERNET : khai báo permission này, ứng dụng của chúng ta sẽ có khả năng kết nối mạng.
Permission ACCESS_NETWORK_STATE : cho phép ứng dụng của chúng ta kiểm tra trạng thái kết nối mạng của điện thoại.
Bước 2 : Kiểm tra kết nối internet của điện thoại. Nếu như điện thoại chưa được kết nối internet, chúng ta sẽ đưa ra thông báo để người dung bật wifi, 3G…
Chúng ta sẽ viết một phương thức để kiểm tra kết nối internet, phương thức trả về true nếu điện thoại đã kết nối, trả về false trong trường hợp ngược lại.
protected boolean checkInternetConnect() {
ConnectivityManager conMgr = (ConnectivityManager) mContext
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo i = conMgr.getActiveNetworkInfo();
if (i == null)
return false;
if (!i.isConnected())
return false;
if (!i.isAvailable())
return false;
return true;
}
Bước 3 : Gửi yêu cầu đến máy chủ.
o Khởi tạo HttpClient : HttpClient có chức năng thực thi HTTPPOST. Để đơn giản, chúng ta sẽ khởi tạo một thể hiện của DefaultHttpClient (DefaultHttpClient là lớp với các cấu hình mặc định cho HttpClient, nếu bạn mong muốn cấu hình khác bạn cần tạo một lớp extends từ HttpClient) :
DefaultHttpClient httpClient = new DefaultHttpClient();
o Khởi tạo HttpPost : Khi khai báo 1 thể hiện của HttpPost có nghĩa là chúng ta sử dụng phương thức POST của HTTP để làm việc với máy chủ. Ngoài phương thức POST, HTTP còn có các phương thức khác như GET. Phương thức Post cho phép gửi kèm dữ liệu được đóng gói (entity) trong quá trình request, còn phương thức Get thì không thể.
String url = “http//….”;
HttpPost httpPost = new HttpPost(url);
o Set header cho HttpPost : set các Header cần thiết cho HTTP.
httpPost.setHeader(“Token”, “355fea376e15ee115b33dc06eb368f93″);
o Set entity cho HttpPost :
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair(name, value);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs, “UTF-8″);
httpPost.setEntity(entity);
o Thực hiện request :
HttpResponse httpResponse = httpClient.execute(httpPost);
Bước 4 : Nhận dữ liệu từ máy chủ. Ở bước 3 khi thực hiện request trả về một thể hiện của HttpResponse. HttpResponse sẽ trả về StatusLine và HttpEntity. Đối tượng StatusLine sẽ có biến statusCode cho biết trạng thái của request : 404 không tìm thấy máy chủ, 200 request thành công… HttpEntity sẽ chứa dữ liệu cụ thể do máy chủ trả về. Do đó việc đầu tiên chúng ta cần làm là kiểm tra statusCode, nếu statusCode nhỏ hơn 400 thì chúng ta mới tiến hàng lấy dữ liệu từ máy chủ trả về. Code cụ thể như sau :
try {
StatusLine statusLine = httpResponse.getStatusLine();
int statusCode = statusLine.getStatusCode();
HttpEntity httpEntity;
if (statusCode < 400) {
httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, “UTF-8″), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + “\n”);
}
is.close();
return sb.toString();
} else {
httpResponse.getEntity().getContent().close();
return String.format(“%d”, statusCode);
}
} catch (ClientProtocolException e) {
return String.format(“%d”, ERROR_CONNECT);
} catch (IOException e) {
return String.format(“%d”, ERROR_CONNECT);
}
Việc request đến server cần thực hiện trong Background, do đó chúng ta sẽ viết tạo ra một lớp extends từ AsyncTask để thực hiện request đến server. AsyncTask được thiết kế để thực hiện các công việc ở background. Một AsyncTask được định xác định bởi 3 đối số : Params, Progress, Result và thực hiện trong 4 bước onPreExecute, doInBackground, onProgressUpdate, onPostExecute. Chúng ta sẽ thực hiện kiểm tra kết nối mạng ở onPreExecute(), thực hiện request đến server ở doInBackground() và xử lý dữ liệu trả về ở onPostExecute(). Code đầy đủ như sau :
private class BaseTutAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
if (!checkInternetConnect()) {
showError(“Cannot connect to server”);
cancel(true);
}
super.onPreExecute();
}
@Override
protected String doInBackground(String… urls) {
String pathUrl = urls[0];
return requestData(pathUrl);
}
@Override
protected void onPostExecute(String result) {
try {
showData(result);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
protected boolean checkInternetConnect() {
ConnectivityManager conMgr = (ConnectivityManager) getActivity()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo i = conMgr.getActiveNetworkInfo();
if (i == null)
return false;
if (!i.isConnected())
return false;
if (!i.isAvailable())
return false;
return true;
}
private String requestData(String url) {
InputStream is = null;
String json = “”;
HttpResponse httpResponse;
DefaultHttpClient httpClient = new DefaultHttpClient();
try {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader(“Token”, “355fea376e15ee115b33dc06eb368f93″);
HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),
6000);
HttpConnectionParams.setSoTimeout(httpClient.getParams(), 60000);
httpClient.getParams().setParameter(
ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true);
httpResponse = httpClient.execute(httpPost);
StatusLine statusLine = httpResponse.getStatusLine();
int statusCode = statusLine.getStatusCode();
HttpEntity httpEntity;
if (statusCode < 400) {
httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, “iso-8859-1″), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + “\n”);
}
is.close();
json = sb.toString();
return json;
} else {
return null;
}
} catch (ConnectTimeoutException e) {
} catch (IOException e) {
}
return null;
}
Code đầy đủ cho ví dụ mời các bạn tải trong link : https://www.mediafire.com/?wh6z3hqhiajagac