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.
Trước khi xây dựng API thêm mới option cho API Option Service, có mấy việc sau chúng ta cần phải làm như sau:
Việc đầu tiên, chúng ta cần làm là thêm mới một đối tượng Option để chứa thông tin của một option.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.huongdanjava.optionservice.dto; import lombok.Data; @Data public class Option { private String id; private String description; private String note; private Boolean isCorrect; private String questionId; } |
Vì API Option Service sẽ gọi đến Core Option Service và Composite Option Service 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 2 |
coreoptionservice.url=http://localhost:8083 compositeoptionservice.url=http://localhost:8183 |
Để handle việc gọi tới Composite Option Service, mình sẽ tạo một interface tên là CompositeOptionService:
1 2 3 4 5 6 7 |
package com.huongdanjava.optionservice.service; public interface CompositeOptionService { String getServiceUrl(); } |
với implementation là CompositeOptionServiceImpl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.huongdanjava.optionservice.service.impl; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.huongdanjava.optionservice.service.CompositeOptionService; @Service public class CompositeOptionServiceImpl implements CompositeOptionService { @Value("${compositeoptionservice.url}") private String compositeOptionServiceUrl; @Override public String getServiceUrl() { return compositeOptionServiceUrl; } } |
Để handle việc gọi tới Core Option Service, mình sẽ tạo một interface tên là CoreOptionService:
1 2 3 4 5 6 7 |
package com.huongdanjava.optionservice.service; public interface CoreOptionService { String getServiceUrl(); } |
với implementation là CoreOptionServiceImpl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.huongdanjava.optionservice.service.impl; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.huongdanjava.optionservice.service.CoreOptionService; @Service public class CoreOptionServiceImpl implements CoreOptionService { @Value("${coreoptionservice.url}") private String coreOptionServiceUrl; @Override public String getServiceUrl() { return coreOptionServiceUrl; } } |
Mình sẽ chạy service này sử dụng port 8283 nên mình cũng sẽ thêm property server.port trong tập tin application.properties như sau:
1 |
server.port=8283 |
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à ApiOptionController với nội dung như sau:
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava.optionservice; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/option") public class OptionController { } |
Với khai báo trên, mình cũng đã expose các API cho API Optipon Service với request URL bắt đầu là “/option”.
Tiếp theo chúng ta sẽ inject CompositeOptionService và CoreOptionService vào để sử dụng:
1 2 3 4 5 |
@Autowired private CoreOptionService coreOptionService; @Autowired private CompositeOptionService compositeOptionService; |
Để xây dựng API thêm mới, mình sẽ thêm mới một method trong class CompositeOptionService tên là:
1 |
Mono<Option> addNewOption(Option option); |
với implementation trong class CompositeOptionServiceImpl như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Override public Mono<Option> addNewOption(Option option) { WebClient client = WebClient.builder() .baseUrl(getServiceUrl()) .build(); WebClient.ResponseSpec responseSpec = client.post() .uri("/option/add") .body(BodyInserters.fromObject(option)) .retrieve(); return responseSpec.bodyToMono(Option.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 Option Service và gọi API thêm mới option của service này với URI “/option/add”.
Tiếp theo, mình sẽ thêm mới một method trong ApiOptionController để expose một POST request “/option/add” để thêm mới option:
1 2 3 4 |
@PostMapping("/add") public Mono<ResponseEntity<Option>> addNewOption(@RequestBody Option option) { } |
Nhiệm vụ của chúng ta chỉ là gọi tới phương thức addNewOption() của CompositeOptionService mà thôi:
1 2 3 4 |
@PostMapping("/add") public Mono<ResponseEntity<Option>> addNewOption(@RequestBody Option option) { return compositeOptionService.addNewOption(option).map(o -> ResponseEntity.ok(o)); } |
Đến đây thì chúng ta đã hoàn thành việc xây dựng API thêm mới option cho API Option Service rồi đó các bạn. Hãy test thử xem sao nhé!