Chào anh em , hiện tại mình đang gặp khúc mắc về việc gọi Rest API trong truy vấn GraphQL
Cụ thể hơn là mỗi trường (field) trong câu query của graphQL trên postman sẽ gọi các RestAPI tương ứng và tất cả các RestAPI sẽ đồng loạt chạy cùng một lúc và mình sử dụng Thread với hệ thống build theo kiểu graphQL ( mình có để dự án ở dưới để anh em tham khảo và xem qua )
Mình đã có làm và ko đc cho là đúng khi có 4 API mà phải tạo 4 class đại diện cho 4 API đó ( vậy nếu có 100 API thì phải tạo 100 class sao ? ) , thêm nữa là sử dụng graphQL ko đúng kiểu nên mình gặp khúc mắc đoạn này , mong ae giúp đỡ
1 số lớp quan trọng trong quá trình call api đồng loạt trong graphql bằng thread
// lớp gọi đồng loạt các api được đựng trong thread
@Component
public class AllPersonsDataFetcher implements DataFetcher<List<convert_data_graphQL_to_rest>> {
@Autowired
PersonRepository personRepository;
public static List<convert_data_graphQL_to_rest> sum_list = new ArrayList<>();
private Call_Api_FirstName call_api_firstName = new Call_Api_FirstName();
private Call_Api_LastName call_api_lastName = new Call_Api_LastName();
private Call_Api_Address call_api_address = new Call_Api_Address();
private Call_Api_Mark call_api_mark = new Call_Api_Mark();
@Override
public List<convert_data_graphQL_to_rest> get(DataFetchingEnvironment dataFetchingEnvironment) throws InterruptedException {
sum_list.clear();
Thread thread_firstname = new Thread(call_api_firstName);
Thread thread_lastname = new Thread(call_api_lastName);
Thread thread_address = new Thread(call_api_address);
Thread thread_mark = new Thread(call_api_mark);
try {
thread_firstname.start();
thread_firstname.join(500);
thread_lastname.start();
thread_address.start();
thread_mark.start();
} catch (IllegalThreadStateException e) {
System.out.println("Error : " + e);
}
Thread.sleep(3500);
check_data_null();
return sum_list;
}
private void check_data_null() {
for (int i = 0; i < sum_list.size(); i++) {
if (sum_list.get(i).getName() == (null) && sum_list.get(i).getLast() == (null)
&& sum_list.get(i).getAddress() == (null) && sum_list.get(i).getMark() == (null)) {
sum_list.remove(i);
i -= 1;
}
}
}
}
// lớp call API
public class Call_Api_FirstName implements Runnable {
@Override
public void run() {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<ArrayList> responseEntity = restTemplate.getForEntity("http://localhost:8019/getFirstName", ArrayList.class);
for (int i = 0; i < responseEntity.getBody().size(); i++) {
sum_list.add(new convert_data_graphQL_to_rest());
sum_list.get(i).setName(String.valueOf(responseEntity.getBody().get(i)));
}
}
}
các lớp call API khác cũng tương tự như lớp Call_Api_FirstName , mình ko viết vào thêm vì dài quá
chi tiết hơn ở link github mình có để ở dưới
hình ảnh về truy vấn graphql trên postman