Bài 7.Tạo Rest API HTTPGET lấy chi tiết đối tượng bằng Vert.X

Như vậy các bạn đã biết tạo Rest API để xem được danh sách đối tượng, cũng như làm được bài lấy danh sách dữ liệu được sắp xếp.

Trong bài này, Tui sẽ hướng dẫn các bạn cách tạo Rest API lấy chi tiết một đối tượng khi biết id của nó.

Ví dụ muốn xem chi tiết của Employee có id là 1:

Ở trên từ Postman ta test API lấy được chi tiết của Employee.

Để lập trình được Rest API này trong Vert.X ta làm như sau:

Trong hàm public void start(Promise startPromise) ta bổ sung thêm lệnh:

 router.get("/api/employees/:id").handler(this::getOneEmployee);

ở trên cú pháp :id cho phép ta lấy dữ liệu theo dạng :

/api/employees/1 –> lấy chi tiết Employee có id =1

/api/employees/2–>lấy chi tiết Employee có id =2

và hàm getOneEmployee: Hàm này sẽ nhận parameter mà ta triệu gọi. Sau đó tìm Employee có Id giống như Parameter này trả về cho viết client, coding:

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));
        }
    }

Dưới đầy là coding đầy đủ của EmployeeVerticle:

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 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);
        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));
        }
    }
}

Vào lớp Universal để chạy ta sẽ có kết quả như mong muốn.

Như vậy các bạn đã biết cách viết API lấy chi tiết 1 đối tượng dựa vào id theo đúng cú pháp Rest

coding mẫu phần này ở đây: https://www.mediafire.com/file/5vmh4dm6hefpomv/LearnRESTApi_OneEmployee.rar/file

Bài sau Tui sẽ hướng dẫn các bạn cách thức thêm mới dữ liệu REST API POST

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

Leave a Reply