Bài 32-Truy cập NodeJS RESTful Web Services bằng Android Kotlin-HTTPPUT


Tiếp tục mở lại Project AndroidKotlinToNodeJS trong bài 31. Bài học này Tui sẽ hướng dẫn các bạn cách triệu gọi API với HTTPPUT Method (để chỉnh sửa dữ liệu của một Product).

Lưu ý là IISNode của toàn bộ API này được deploy trong bài 28. Và API Edit Product được trình bày chi tiết trong bài 26. Nếu nếu các Thím có quên thì coi lại những bài này (tốt nhất là đừng quên, cứ làm theo tuần tự từ bài 1->bài cuối cùng thì chắc chắn không bao giờ quên. Đừng tỏ vẻ nguy hiểm nhảy cóc sẽ mất thời gian, vì các bài học Tui đã chủ ý thiết kế từ cơ bản đến nâng cao mà bài sau kế thừa bài trước).

Nhắc lại ở bài 31 ta đã triệu gọi API HTTPGET để lấy chi tiết thông tin của một Product hiển thị lên 1 màn hình mới rồi, giờ cũng trong màn hình hiển thị chi tiết đó ta chỉnh sửa thông tin của TÊN + ĐƠN GIÁ rồi bấm lưu thay đổi–>triệu gọi API HTTPPUT để thay đổi.

Xem giao diện minh họa dưới đây:

Bước 1: Trong màn hình chính hiển thị danh sách Product, nhấn vào nút Edit

Bước 2: Thông tin chi tiết được hiển thị lên màn hình chi tiết

Bước 3: Trong màn hình chi tiết ta sửa tên và đơn giá rồi bấm nút “Đổi thông tin”

Bước 4: Chương trình tải lại và ta thấy kết quả thay đổi.

Chi tiết các bước lập trình để triệu gọi API HTTPUT chỉnh sửa thông tin Product như sau (trong bài học Tui hướng dẫn thì API này là: http://192.168.1.137/nodejsapi/editProduct (của bạn cấu hình thế nào thì lấy thế đó nha, copy y xì như của Tui là đi đạp xích lô đó nha).

Xem lại hình thử nghiệm trong bài 28:

Ở trên ta thấy cần phải truyền 3 Parameter (Ma, Ten, DonGia) từ Android lên cho NodeJS xử lý. Vậy truyền như thế nào? Lưu ý có nhiều thư viện như volley, retrofit… để hỗ trợ tương tác dịch vụ Web. Tuy nhiên các thư viện này Tui chưa sài, nếu có Tui sẽ hướng dẫn thêm ở những bài khác. Bây giờ hãy làm theo chuẩn HttpURLConnection trước.

OK, action nha.

Trong Project AndroidKotlinToNodeJS  các bạn làm theo bước sau:

Bước 1: Chỉnh sửa lớp Product.kt để tạo Parameter gửi lên Server NodeJS


package com.communityuni.model

import java.net.URLEncoder

class Product {
lateinit var _id:Any
lateinit var Ma:String
lateinit var Ten:String
var DonGia:Double=0.0
constructor(ma:String,ten:String,donGia:Double)
{
Ma=ma
Ten=ten
DonGia=donGia
}
override fun toString(): String {
return Ma+"\n"+Ten+"\n"+DonGia+"VNĐ"
}
public fun parameters(): String
{
return "Ma="+Ma+"&Ten="+URLEncoder.encode(Ten,"UTF-8")+"&DonGia="+DonGia
}
}

bạn thấy hàm parameters() ở trên không? Tui coding cho nó trả về 1 chuỗi có cú pháp, đây chính là các nội dung ta gửi lên Server NodeJS để xử lý. Những chuỗi nào liên quan Unicode thì ta phải dùng URLEncoder như trên để mã hóa nó nha, nếu quên sẽ bị failed. Các đối số cách nhau bởi dấu & nha, bạn thay dấu & bằng dấu khác cũng được nhưng mà sai.

Bước 2:

Xử lý coding nhấn vào nút Thay đổi thông tin.

Trong lớp ChiTietActivity.kt bổ sung thêm 1 inner class HTTPPUTProductTask nhiệm vụ của nó là triệu gọi API HTTPUT (http://192.168.1.137/nodejsapi/editProduct) và gửi dữ liệu lên NodeJS Server(dữ liệu được coding trong hàm parameter() của lớp Product.kt. (Bổ sung thêm coding tức là phải giữ nguyên coding cũ, coding cũ Tui không có đưa vào đây nha)


inner class HTTPPUTProductTask : 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/editProduct"
var url=URL(api)
var urlConnection= url.openConnection() as HttpURLConnection
urlConnection.requestMethod="PUT"
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 = p!!.parameters()
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)
thongBao(result)
}
}

Bước 3: Viết sự kiện cho nút Thay đổi thông tin để gọi đa tiến trình ở bước 2 (Sự kiện các bạn dùng onclick XML nha, nên Tui không chụp lại XML layout nữa vì nó chỉ có 1 thay  đổi nhỏ):


fun xuLyCapNhat(v:View)
{
var Ma=edtMa.text.toString()
var Ten=edtTen.text.toString()
var DonGia=edtDonGia.text.toString().toDouble()
var p=Product(Ma,Ten,DonGia)
HTTPPUTProductTask().execute(p)
}
private fun thongBao(result: Boolean?) {
if(result==true)
{
Toast.makeText(applicationContext,"Cập nhật thành công",Toast.LENGTH_LONG).show()
finish()
}
else
{
Toast.makeText(applicationContext,"Cập nhật thất bại",Toast.LENGTH_LONG).show()
}
}

OK, vậy là ngon lành cành đạo như cơm mẹ nấu rồi đó, chạy lên ta sẽ có kết quả như mong muốn

Như vậy ta đã hoàn thành xong bài triệu gọi Web API HttpPUT để chỉnh sửa thông tin của 1 Product.

Source code Triệu gọi Web API thay đổi thông tin 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 Xóa 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: http://communityuni.com/

Innovate Trading System (Kênh đầu tư lợi nhuận rất cao), các bạn nào quan tâm thì vào đây đầu tư nhé:

Chúc các bạn thành công!

One response

  1. […] HTTPPUT -http://192.168.1.137/nodejsapi/editProduct (API chỉnh sửa Product trong MongoDB)->Xem bài 32 […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: