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=newArrayList<NameValuePair>(1);
doiso.add(newBasicNameValuePair("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=newUrlEncodedFormEntity(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=newBasicResponseHandler();
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 extendsAsyncTask<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=newUrlEncodedFormEntity(doiso,"UTF-8");
httppost.setEntity(entity);
ResponseHandler<String> handler = newBasicResponseHandler();
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";
newLayDuLieu().execute(new String[]{path});
No comments:
Post a Comment