[Android] Test HTTP theo phương thức POST, GET, HttpURLConnection
Bài 1: Test HTTP theo phương thức POST
Chuẩn bị phía server (dùng PHP&MySQL)
1 1. Cài
webserver. Vào thư mục www của web server và tạo thư mục con tên “testandroid”.
2.Trong
thư mục “testandroid” tạo ra file tên “nhan.php” có mã như sau:
<?
echo
"xin chao ban " . $_POST["name"];
?>
Phía client (là chương trình android).
1 1.Tạo
project mới tên httpdemo1 (chú ý: chọn phiên bản là 1.6 nhé).
2.Trong
file Mainfest cấp quyền như sau:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3.Qua
file java chính đầu tiên trong hàm onCreate tạo ra đối tượng HttpClient và
HttpPost
HttpClient httpclient= new DefaultHttpClient();
4 4.Tiếp
theo xây dựng các đối số
List<NameValuePair> doiso=new
ArrayList<NameValuePair>(1);
doiso.add(new
BasicNameValuePair("name","teo"));
5.Cuối
cùng gán đối số vào đối tượng HttpPost, tạo ResponseHandler và gọi execute để
nhận về nội dung (các catch đã được bỏ bớt).
try {
UrlEncodedFormEntity entity=new
UrlEncodedFormEntity(doiso,"UTF-8");
httppost.setEntity(entity);
ResponseHandler<String>
handler = new BasicResponseHandler();
String content =
httpclient.execute(httppost, handler);
Log.d("thongbao","noidung"+content);
}catch(Exception e)
{
Log.d("loi","loi " + e.toString());
}
6 6.Chạy
và test logcat.
Bài 2 Test HTTP theo phương thức GET
Phía server
1.Cùng
chổ với nhan.php tạo 1 trang mới tên nhanget.php có nội dung như sau:
<?
echo
"xin chao ban " . $_GET["name"]. "ban goi du lieu bang
get";
?>
Phía client (chương trình android).
1.Tạo
project mới tên httpdemo2 (chọn phiên bản 1.6).
1.Vào
mainfest cấp quyền
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3.Qua
file java chính, trong hàm onCreate tạo đối tượng HttpClient và HttpGet.
HttpClient client =new DefaultHttpClient();
HttpGet httpget=new
HttpGet("http://10.0.2.2:8080/testandroid/nhanget.php?name=ti");
4.Tiếp
theo tạo ResponseHandler rồi gọi execute để thực thi và lấy kết quả về.
ResponseHandler<String> handler=new
BasicResponseHandler();
try {
String
content=client.execute(httpget, handler);
Log.d("thongbao", ""+content);
} catch (Exception e)
{
Log.d("loi" ,"loi: "+e.toString());
}
5.Chạy
và kiểm tra logcat
6.Có thể đọc thông qua InputStreamReader, sửa lại
mã như sau:
HttpClient client =new DefaultHttpClient();
HttpGet
httpget=new HttpGet();
httpget.setURI(new URI("http://10.0.2.2:8080/testandroid/nhanget.php?name=ti"));
HttpResponse response=client.execute(httpget);
InputStreamReader is=new InputStreamReader(response.getEntity().getContent());
BufferedReader buff=new BufferedReader(is);
String line;
while((line=buff.readLine())!=null)
{
Log.d("dulieu",""+ line);
}
Bài 3 Test HTTP theo HttpURLConnection
Phía server:
Dùng lại từ bài 2
Phía client
1 1.Tạo
project mới tên httpdemo3 (chọn phiên bản 1.6).
2.Vào
mainfest cấp quyền
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3.Trong hàm onCreate tạo ra đối tượng URL và cung
cấp đường dẫn cho nó, tiếp theo tạo đối tượng HttpURLConnection và gọi
openConnection.
URL url=new URL("http://10.0.2.2:8080/testandroid/nhanget.php?name=ti");
HttpURLConnection
httpurl=(HttpURLConnection)url.openConnection();
4.Đọc dữ liệu từng dòng vào thông qua
BufferedReader và InputStreamReader.
BufferedReader in=
new BufferedReader(new InputStreamReader(httpurl.getInputStream()));
String line="";
StringBuffer sb=new StringBuffer("");
while((line=in.readLine())!=null)
{
sb.append(line);
}
Log.d("dulieu", ""+sb
+ " theo HttpURLConnection");
5.Đóng kết nối lại
httpurl.disconnect();
6.Chạy chương trình và theo dõi Logcat.
Nâng cấp lên phiên bản cao và cập nhật giao diện.
Yêu cầu: Phát triển từ 1 trong 3
phương pháp trên (3 bài trên). Để cho phép chạy trên phiên bản cao (vd: 3.x,
4.x). Cập nhật thông tin trả về trên giao diện (TextView) thay cho dùng LogCat.
Gợi ý:
Dùng AysncTask
Chung ta can xử lý 2 vấn đề
1. Nâng
cấp lên 3.0 trở lên thì sẽ bị lỗi
NetworkOnMainThreadException do các phiên bản cao thì việc kết nối đến network
sẽ bắt lỗi không cho đặt nó trong Thread chính, phải tạo thread riêng cho các
tác vụ đụng đến network để đảm bảo an toàn cho chương trình.
2.Phải
cập nhật lại giao diện khi có dữ liệu từ net được trả về.
Hai vấn đề đều được giải quyết bằng cách dùng AsyncTask.
Sửa từ Bài 1
1.Xây
1 class là subClass của Class chính như
sau:
class LayDuLieu extends
AsyncTask<String,Void,String>
{
@Override
protected String
doInBackground(String... arg0) {
// TODO Auto-generated
method stub
HttpClient httpclient= new DefaultHttpClient();
HttpPost httppost=new HttpPost(arg0[0]);
List<NameValuePair> doiso=new ArrayList<NameValuePair>(1);
doiso.add(new BasicNameValuePair("name","teo"));
try {
UrlEncodedFormEntity entity=new
UrlEncodedFormEntity(doiso,"UTF-8");
httppost.setEntity(entity);
ResponseHandler<String> handler = new
BasicResponseHandler();
String content = httpclient.execute(httppost,
handler);
Log.d("thongbao","noidung"+content);
return content;
}catch(Exception e)
{
Log.d("loi","loi " + e.toString());
}
return null;
}
@Override
protected void onPostExecute(String
result) {
// TODO Auto-generated
method stub
super.onPostExecute(result);
tv.setText("du lieu tra
ve la : "+ result);
}
}
2.Trong
OnCreate viết thêm như sau:
String path="http://10.0.2.2:8080/testandroid/nhan.php";
new
LayDuLieu().execute(new String[]{path});
No comments: