Ở bài 8 các bạn đã biết cách tạo REST API HTTPPOST để thêm mới một đối tượng, bài này Tui sẽ hướng dẫn cách tạo HTTPPUT để cập nhật đối tượng.
Quy tắc làm cũng tương tự, bạn cần thêm route sau vào hàm start của EmployeeVerticle:
router.route("/api/employees*").handler(BodyHandler.create());
Sau đó build một hàm tên updateOneEmpoyee để cập nhật dữ liệu:
/**
* Hàm cập nhật dữ liệu
* @param routingContext
*/
private void updateOneEmpoyee(RoutingContext routingContext) {
HttpServerResponse response=routingContext.response();
response.putHeader("content-type","application/json;charset=UTF8");
//routingContext.getBody() lấy dữ liệu là cấu trúc Json từ client
//Json.decodeValue(routingContext.getBody(),Employee.class); mô hình hóa là Java model
Employee emp=Json.decodeValue(routingContext.getBody(),Employee.class);
//kiểm tra id tồn tại không
if(employees.containsKey(emp.getId()))
{
employees.put(emp.getId(), emp);//nếu tốn tại thì chỉnh sửa
response.end("true");//trả về true khi chỉnh sửa thành công
}
else
response.end("false");//trả về false khi chỉnh sửa thất bại
}
Trong hàm start ta khai báo API PUT:
router.route("/api/employees*").handler(BodyHandler.create());
router.put("/api/employees").handler(this::updateOneEmpoyee);
Dưới đây là coding đầy đủ của chương trình:
package tranduythanh.com.verticle;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.core.json.Json;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.handler.BodyHandler;
import tranduythanh.com.model.Employee;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
public class EmployeeVerticle extends AbstractVerticle
{
private HashMap employees=new HashMap();
public void createExampleData()
{
employees.put(1,new Employee(1,"Mr Obama","Obama@gmail.com"));
employees.put(2,new Employee(2,"Mr Donald Trump","Trump@gmail.com"));
employees.put(3,new Employee(3,"Mr Putin","Putin@gmail.com"));
}
private void getAllEmployees(RoutingContext routingContext) {
HttpServerResponse response=routingContext.response();
response.putHeader("content-type","application/json;charset=UTF-8");
response.end(Json.encodePrettily(employees.values()));
}
@Override
public void start(Promise startPromise) throws Exception {
createExampleData();
Router router=Router.router(vertx);
router.get("/api/employees").handler(this::getAllEmployees);
router.get("/api/employeessort").handler(this::getSortEmployees);
router.get("/api/employees/:id").handler(this::getOneEmployee);
router.route("/api/employees*").handler(BodyHandler.create());
router.post("/api/employees").handler(this::insertNewEmployee);
router.put("/api/employees").handler(this::updateOneEmpoyee);
vertx
.createHttpServer()
.requestHandler(router::accept)
.listen(config().getInteger("http.port", 8080),
result -> {
if (result.succeeded()) {
startPromise.complete();
} else {
startPromise.fail(result.cause());
}
}
);
}
/**
* Hàm này dùng để lấy danh sách dữ liệu Employee mà có sắp xếp
* http://localhost:8080/api/employeessort?sort=desc ->giảm dần
* http://localhost:8080/api/employeessort?sort=asc ->tăng dần
* @param routingContext
*/
private void getSortEmployees(RoutingContext routingContext) {
HttpServerResponse response=routingContext.response();
response.putHeader("content-type","application/json;charset=UTF-8");
//parameter lấy từ người dùng
String sort = routingContext.request().getParam("sort");
if (sort == null)
{
//nếu không có thì cho lỗi luôn API
routingContext.response().setStatusCode(400).end();
}
else
{
//dùng ArrayList để lưu trữ các Key của dữ liệu
ArrayList sortedKeys =
new ArrayList(employees.keySet());
//mặc định sắp xếp tăng dần các Key
Collections.sort(sortedKeys);
//nếu sort là desc (giảm dần)
if(sort.equalsIgnoreCase("desc"))
{
//thì đảo ngược lại danh sách đang tăng dần -> nó tự thành giảm dần
Collections.reverse(sortedKeys);
}
//khai báo danh sách Employee là ArrayList
ArrayListsortEmployees=new ArrayList();
//vòng lặp theo Key
for (int key : sortedKeys)
{
//mỗi lần lấy employees.get(key) là đã lấy tăng dần hoặc giảm dần (vì key đã sắp xếp)
sortEmployees.add(employees.get(key));
}
//trả về danh sách đã sắp xêp
response.end(Json.encodePrettily(sortEmployees));
}
}
//Hàm trả về thông tin chi tiết của 1 Employee khi biết Id của họ
private void getOneEmployee(RoutingContext routingContext) {
HttpServerResponse response=routingContext.response();
response.putHeader("content-type","application/json;charset=utf-8");
//lấy id nhập từ URL
String sid = routingContext.request().getParam("id");
if (sid == null) {//nếu không tồn tại thì báo lỗi
routingContext.response().setStatusCode(400).end();
}
else
{
//đưa id đó về số (vì dữ liệu lấy từ URL là chuỗi
int id=Integer.parseInt(sid);
//trả về Empoyee có mã là id
Employee empFound=employees.get(id);
//xuất Json chi tiết Employee ra cho client
response.end(Json.encodePrettily(empFound));
}
}
//Hàm nhận Json Object Employee để lưu vào Server
private void insertNewEmployee(RoutingContext routingContext) {
HttpServerResponse response=routingContext.response();
response.putHeader("content-type","application/json;charset=UTF8");
try {
//routingContext.getBody() lấy dữ liệu từ client gửi lên, nó có định dạng Json
//Json.decodeValue(routingContext.getBody(),Employee.class);->đưa Json đó về Employee
Employee emp=Json.decodeValue(routingContext.getBody(),Employee.class);
//đưa vào HashMap
employees.put(emp.getId(),emp);
//xuất kết quả là true xuống cho client nếu lưu thành công
response.end("true");
}
catch (Exception ex)
{
response.end(ex.getMessage());//lưu thất bại (khác true)
}
}
/**
* Hàm cập nhật dữ liệu
* @param routingContext
*/
private void updateOneEmpoyee(RoutingContext routingContext) {
HttpServerResponse response=routingContext.response();
response.putHeader("content-type","application/json;charset=UTF8");
//routingContext.getBody() lấy dữ liệu là cấu trúc Json từ client
//Json.decodeValue(routingContext.getBody(),Employee.class); mô hình hóa là Java model
Employee emp=Json.decodeValue(routingContext.getBody(),Employee.class);
//kiểm tra id tồn tại không
if(employees.containsKey(emp.getId()))
{
employees.put(emp.getId(), emp);//nếu tốn tại thì chỉnh sửa
response.end("true");//trả về true khi chỉnh sửa thành công
}
else
response.end("false");//trả về false khi chỉnh sửa thất bại
}
}
Deploy EmployeeVerticle, ta thử nghiệm thứ tự:
- gọi API GET để lấy danh sách Employee->có Id 2 tên là Mr Donald Trump
- sau đó gọi method PUT, chỉnh cấu trúc body Json là Employee như:
- chọn phương thức PUT (nút số 1)
- chọn API http://localhost:8080/api/employees (nút số 2)
- trong body chọn raw (nút số 3)
- trong body chọn JSON (nút số 4)
- tạo cấu trúc Json để put lên Server (mục số 5)
{
"id": 2,
"name": "Mr Biden",
"email": "biden@gmail.com"
}
- Nhấn nút Send (nút số 6)
- kết quả trả về là true (mục số 7)
Xem hình triệu gọi như bên dưới:
Sau khi có kết quả true trả về–>gọi lại API GET danh sách Employee. ta thấy Donald Trump đã được thay thế bởi Biden.
Như vậy Tui đã hướng dẫn xong cách tạo REST API HTTPPUT để chỉnh sửa dữ liệu
coding tham khảo ở đây: https://www.mediafire.com/file/9rj8hummmiin47x/LearnRESTApi_PUT.rar/file
bài sau Tui sẽ hướng dẫn cách tạo REST API HTTPDELETE để xóa đối tượng .
Chúc các bạn thành công