Bài 10.Tạo Rest API HTTPDELETE để xóa đối tượng bằng Vert.X


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

(nguồn hình https://debugmode.net/)

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:

  1. chọn Phương thức DELETE
  2. nhập http://localhost:8080/api/employees/2 với 2 là id employee muốn xóa
  3. nhấn nút send
  4. 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.

2 responses

  1. […] 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 […]

  2. […] 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 […]

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.