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.