Xem toàn bộ series bài viết hướng dẫn xây dựng ứng dụng Questions Management tại đây.
API Question Service sẽ gọi đến các Composite và Core Service khác để process request của người dùng và trả về kết quả dựa vào kiểu dữ liệu mà người dùng muốn. Do đó, trước khi xây dựng API lấy tất cả question cho API Question Service, có mấy việc sau chúng ta cần phải làm:
Việc đầu tiên, chúng ta cần làm là thêm mới một đối tượng CompositeQuestion để chứa thông tin của question.
Tất nhiên chúng ta cũng phải định nghĩa các đối tượng khác để chứa thông tin của question, category và option như sau:
Question:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.questionservice.dto; import lombok.Data; @Data public class Question { private String id; private String description; private String categoryId; } |
Category:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.questionservice.dto; import lombok.Data; @Data public class Category { private String id; private String name; } |
Option:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.huongdanjava.questionservice.dto; import lombok.Data; @Data public class Option { private String id; private String description; private String note; private Boolean isCorrect; private String questionId; } |
CompositeQuestion:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.huongdanjava.questionservice.dto; import java.util.List; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class CompositeQuestion { private String id; private String description; private Category category; private List<Option> options; } |
Vì API Question Service sẽ gọi đến các Core và Composite Service khác nên mình cũng sẽ cấu hình thông tin về các service đó trong tập tin application.properties như sau:
1 |
compositequestionservice.url=http://localhost:8181 |
Để handle việc gọi tới Composite Question Service, mình sẽ tạo một interface tên là CompositeQuestionService:
1 2 3 4 5 6 7 |
package com.huongdanjava.questionservice.service; public interface CompositeQuestionService { String getServiceUrl(); } |
với implementation là CompositeQuestionServiceImpl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.huongdanjava.questionservice.service.impl; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.huongdanjava.questionservice.service.CompositeQuestionService; @Service public class CompositeQuestionServiceImpl implements CompositeQuestionService { @Value("${compositequestionservice.url}") private String compositeQuestionServiceUrl; @Override public String getServiceUrl() { return compositeQuestionServiceUrl; } } |
Như các bạn thấy, trong class CompositeQuestionServiceImpl, mình đã inject sẵn thông tin về base URL của Composite Question Service.
Mình sẽ chạy service này sử dụng port 8182 nên mình cũng sẽ thêm property server.port trong tập tin application.properties như sau:
1 |
server.port=8281 |
OK, mọi thứ chuẩn bị đã xong, bây giờ mình sẽ đi vào phần chính của bài viết này các bạn nhé!
Mình sẽ tạo mới một controller tên là ApiQuestionController với nội dung như sau:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.questionservice; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/question") public class ApiQuestionController { } |
Với khai báo trên, mình cũng đã expose các API cho phần API Question Service với request URL bắt đầu là “/question”.
Tiếp theo chúng ta sẽ injest CompositeQuestionService vào để sử dụng:
1 2 |
@Autowired private CompositeQuestionService compositeQuestionService; |
Để xây dựng API lấy tất cả các question, mình sẽ thêm mới một method trong class CompositeQuestionService tên là:
1 |
Flux<CompositeQuestion> findAllQuestions(); |
với implementation như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
@Override public Flux<CompositeQuestion> findAllQuestions() { WebClient client = WebClient.builder() .baseUrl(getServiceUrl()) .build(); WebClient.ResponseSpec responseSpec = client.get() .uri("/question/all") .retrieve(); return responseSpec.bodyToFlux(CompositeQuestion.class); } |
Như các bạn thấy, ở đây mình đã sử dụng đối tượng WebClient để kết nối tới Composite Question Service và gọi API lấy tất cả question của service này với URI “/question/all”.
Tiếp theo, mình sẽ thêm mới một method trong ApiQuestionController để expose một GET request “/all” lấy tất cả question:
1 2 3 4 |
@GetMapping("/all") public Flux<CompositeQuestion> findAllQuestions() { } |
Nhiệm vụ của chúng ta chỉ là gọi tới phương thức findAllQuestions() của CompositeQuestionService mà thôi:
1 2 3 4 |
@GetMapping("/all") public Flux<CompositeQuestion> findAllQuestions() { return compositeQuestionService.findAllQuestions(); } |
Đến đây thì chúng ta đã hoàn thành việc xây dựng API lấy tất cả question cho API Question Service rồi đó các bạn. Hãy test thử xem sao nhé!