Như vậy các bạn đã triệu gọi thành công được 3 RESTful Web API trong ví dụ (lấy danh sách Product, xem chi tiết Product và chỉnh sửa thông tin Product). Bài này ta sẽ coding để Xóa Product khỏi MongoDB thông qua việc triệu gọi API HTTPDELETE.
Cụ thể, trong màn hình đầu tiên hiển thị danh sách Product, ta nhấn vào biểu tượng sọt rác, Chương trình sẽ hiển thị cửa sổ hỏi có muốn Xóa hay không (AlertDialog). Nếu chọn Không thì trở về màn hình ban đâu, nếu chọn Có Chứ thì sẽ Xóa Product đó đồng thời gọi lại API hiển thị Danh sách Product để tại lại và hiển thị lên Listview với danh sách mới sau khi xóa.
Vậy ta coding như sau:
Bước 1:
Trong lớp ProductAdapter, bổ sung thêm inner class để xử lý đa tiến trình tên là HTTPDELETEProductTask triệu gọi API xóa Product, coding:
[code language=”java”]
inner class HTTPDELETEProductTask : AsyncTask<Product, Void, Boolean>()
{
override fun doInBackground(vararg p0: Product?): Boolean {
var p:Product?=p0[0]
try
{
var api=”http://192.168.1.137/nodejsapi/deleteProduct”
var url= URL(api)
var urlConnection= url.openConnection() as HttpURLConnection
urlConnection.requestMethod=”DELETE”
urlConnection.doOutput=true
urlConnection.doInput=true
urlConnection.addRequestProperty(“Content-Type”,
“application/x-www-form-urlencoded; charset=UTF-8”);
val outputStream = urlConnection.getOutputStream()
val bufferedWriter = BufferedWriter(OutputStreamWriter(outputStream, “UTF-8”))
val put_data = “Ma=”+p!!.Ma
bufferedWriter.write(put_data)
bufferedWriter.flush()
bufferedWriter.close()
outputStream.close()
var result =urlConnection.inputStream.bufferedReader().readText()
urlConnection.disconnect()
return result.equals(“true”)
}
catch (ex:Exception)
{
Log.e(“LOI”,ex.toString())
}
return false
}
override fun onPostExecute(result: Boolean?) {
super.onPostExecute(result)
if(result==true)
{
(context as MainActivity).HTTPGetListProductTask().execute()
}
}
}
[/code]
Đầu vào là 1 Product (Product này được lấy ra khi ta nhấn vào nút Xóa)
Vì muốn Xóa thì chỉ cần gửi Ma lên mà thôi, nên trong coding Tui viết luôn: val put_data = “Ma=”+p!!.Ma
Bước 2:
Trong hàm getView của ProductAdapter, ta bổ sung khai báo biến và gán sự kiện cho nút Xóa như sau:
[code language=”java”]
var imgDelete=custom.findViewById<ImageView>(R.id.imgDelete)
imgDelete.setOnClickListener{xuLyDelete(p)}
[/code]
hàm xuLyDelete được viết như sau:
[code language=”java”]
private fun xuLyDelete(p: Product?) {
var builder=AlertDialog.Builder(context)
builder.setTitle(“Xác nhận xóa”)
builder.setMessage(“Thím có chắc chắn muốn xóa Product [“+p!!.Ten+”] không?”)
builder.setNegativeButton(“Không”,
DialogInterface.OnClickListener
{ dialogInterface, i -> dialogInterface.dismiss()})
builder.setPositiveButton(“Có chứ”, DialogInterface.OnClickListener
{ dialogInterface, i ->
HTTPDELETEProductTask().execute(p)
})
builder.create().show()
}
[/code]
Vậy cuối cùng ta có coding đầy đủ của lớp ProductAdapter như dưới đây:
[code language=”java”]
package com.communityuni.adapter
import android.app.Activity
import android.app.AlertDialog
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.os.AsyncTask
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import com.communityuni.androidkotlintonodejs.ChiTietActivity
import com.communityuni.androidkotlintonodejs.MainActivity
import com.communityuni.androidkotlintonodejs.R
import com.communityuni.model.Product
import java.io.BufferedWriter
import java.io.OutputStreamWriter
import java.net.HttpURLConnection
import java.net.URL
class ProductAdapter(internal var context: Activity, internal var resource: Int) : ArrayAdapter<Product>(context, resource) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
var custom = context.layoutInflater.inflate(resource, null)
var txtMa = custom.findViewById<TextView>(R.id.txtMa)
var txtTen = custom.findViewById<TextView>(R.id.txtTen)
var txtDonGia = custom.findViewById<TextView>(R.id.txtDonGia)
var p = getItem(position)
txtMa.text = p!!.Ma
txtTen.text = p.Ten
txtDonGia.text = p.DonGia.toString()
var img=custom.findViewById<ImageView>(R.id.imgEdit)
img.setOnClickListener { xuLyEdit(p) }
var imgDelete=custom.findViewById<ImageView>(R.id.imgDelete)
imgDelete.setOnClickListener{xuLyDelete(p)}
return custom
}
private fun xuLyEdit(p: Product?) {
var i=Intent(context,ChiTietActivity::class.java)
i.putExtra(“Ma”,p!!.Ma)
context.startActivity(i)
}
private fun xuLyDelete(p: Product?) {
var builder=AlertDialog.Builder(context)
builder.setTitle(“Xác nhận xóa”)
builder.setMessage(“Thím có chắc chắn muốn xóa Product [“+p!!.Ten+”] không?”)
builder.setNegativeButton(“Không”,
DialogInterface.OnClickListener
{ dialogInterface, i -> dialogInterface.dismiss()})
builder.setPositiveButton(“Có chứ”, DialogInterface.OnClickListener
{ dialogInterface, i ->
HTTPDELETEProductTask().execute(p)
})
builder.create().show()
}
inner class HTTPDELETEProductTask : AsyncTask<Product, Void, Boolean>()
{
override fun doInBackground(vararg p0: Product?): Boolean {
var p:Product?=p0[0]
try
{
var api=”http://192.168.1.137/nodejsapi/deleteProduct”
var url= URL(api)
var urlConnection= url.openConnection() as HttpURLConnection
urlConnection.requestMethod=”DELETE”
urlConnection.doOutput=true
urlConnection.doInput=true
urlConnection.addRequestProperty(“Content-Type”,
“application/x-www-form-urlencoded; charset=UTF-8”);
val outputStream = urlConnection.getOutputStream()
val bufferedWriter = BufferedWriter(OutputStreamWriter(outputStream, “UTF-8”))
val put_data = “Ma=”+p!!.Ma
bufferedWriter.write(put_data)
bufferedWriter.flush()
bufferedWriter.close()
outputStream.close()
var result =urlConnection.inputStream.bufferedReader().readText()
urlConnection.disconnect()
return result.equals(“true”)
}
catch (ex:Exception)
{
Log.e(“LOI”,ex.toString())
}
return false
}
override fun onPostExecute(result: Boolean?) {
super.onPostExecute(result)
if(result==true)
{
(context as MainActivity).HTTPGetListProductTask().execute()
}
}
}
}
[/code]
Chạy phần mềm lên và thao tác Xóa sẽ thành công như Tui hướng dẫn nha.
Như vậy ta đã hoàn thành xong bài triệu gọi Web API HttpDelete để xóa 1 Product.
Source code Triệu gọi Web API xóa Product tải ở đây.
Bài sau Tui sẽ hướng dẫn các Thím cách dùng Android Kotlin để truy cập API RESTful Thêm mới Product như thế nào. Các bạn chú ý theo dõi nhé (vẫn dùng lại Project này)
Các khóa học online khác, bạn có thể tham khảo tại đây:
3 thoughts on “Bài 33-Truy cập NodeJS RESTful Web Services bằng Android Kotlin-HTTPDELETE”