Như vậy trong CRUD API các bạn đã xong được C, R, U. Bây giờ ta qua API cuối cùng nhé, đó là Xóa dữ liệu trong Vert.X. Sau bài này các bạn sẽ được học về Authen, MongoDB kết hợp với Vert.X
C: Create (thêm mới)-> dùng phương thức POST
R: Retrieve (hay Read), truy vấn và sắp xếp dữ liệu-> dùng phương thức GET
U: Update – Cập nhật dữ liệu->dùng phương thức PUT
D: Delete->xóa dữ liệu->dùng phương thức Delete
Ta bổ sung coding bằng cách thêm hàm deleteOneEmployee. Hàm này sẽ nhận vào id của Employee truyền vào để tiến hành kiểm tra và xóa nếu id tồn tại:
/** * Hàm này dùng để xóa một Employee khi biết Id * @param routingContext */ private void deleteOneEmployee(RoutingContext routingContext) { HttpServerResponse response=routingContext.response(); response.putHeader("content-type","application/json;charset=UTF-8"); //lấy id từ client String sid=routingContext.request().getParam("id"); //đưa về int int id=Integer.parseInt(sid); //kiểm tra id tồn tại hay không if(employees.containsKey(id)) { employees.remove(id);//có thì xóa response.end("true");//xóa thành công trả về true } else response.end("false");//không tìm thấy trả về false }
Tiếp đến, Trong hàm start cần có các lệnh:
router.route(“/api/employees*”).handler(BodyHandler.create());
router.delete(“/api/employees/:id”).handler(this::deleteOneEmployee);
Dưới đây là coding đầy đủ của Rest API HTTPDELETE:
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); router.delete("/api/employees/:id").handler(this::deleteOneEmployee); 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 } /** * Hàm này dùng để xóa một Employee khi biết Id * @param routingContext */ private void deleteOneEmployee(RoutingContext routingContext) { HttpServerResponse response=routingContext.response(); response.putHeader("content-type","application/json;charset=UTF-8"); //lấy id từ client String sid=routingContext.request().getParam("id"); //đưa về int int id=Integer.parseInt(sid); //kiểm tra id tồn tại hay không if(employees.containsKey(id)) { employees.remove(id);//có thì xóa response.end("true");//xóa thành công trả về true } else response.end("false");//không tìm thấy trả về false } }
Chạy phần mềm ta được:
- chọn Phương thức DELETE
- nhập http://localhost:8080/api/employees/2 với 2 là id employee muốn xóa
- nhấn nút send
- kết quả trả về true nếu xóa thành công, false nếu xóa thất bại
Dưới đây là coding của bài học: https://www.mediafire.com/file/r7izu7ywyszi7rb/LearnRESTApi_DELETE.rar/file
chúc các bạn thành công
Bài sau Tui sẽ trình bày về Authentication khi gọi API.
[…] tiết để xây dựng bức tường xác thực cho các REST API, mở lại dự án “LearnRESTApi” ở bài […]
[…] chi tiết để xây dựng bức tường xác thực cho các REST API, mở lại dự án “LearnRESTApi” ở bài […]