Gọi REST API trong câu truy vấn graphQL

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

Ối giời ơi! :face_vomiting:


Cậu code kiểu này thì chết!
Tớ sẽ chỉ ra một vài điểm để cậu sửa. Cậu cần nghiêm túc sửa nó trước khi bàn tới giải pháp cho bất cứ thứ gì.

  1. Cậu cần học lại naming convention của Java.
    Nghiêm túc đấy, code này của cậu mà để ai khó tính (cỡ tớ) nhìn thấy, là cậu sẽ không được code thêm bất cứ dòng nào cho tới khi cậu biết Java naming convention.
  2. Nếu cậu dùng Spring, cậu phải làm theo cách của Spring.
    Bài viết này có hướng dẫn cơ bản cách cậu kết nối với graphQL. Cậu nên đọc và làm theo nó.
    Spawn n thread để gọi n field khác nhau không khác gì cậu tuyển n developer, mỗi người viết 1 dòng code rồi bị đuổi cả.
  3. ResponseEntity<ArrayList> :man_facepalming:

Thử làm lại nhé cậu!

6 Likes

Chỗ generic đó phải là List DTO VD: lsStudent, listProuct, …

mình sử dụng ThreadPool với mô hình newCachedThreadPool và tạo 1 arraylist có chứa các link rest API đó , rồi sử dụng ThreadPoolExecutor để execute thì bạn thấy cách này ok ko nhỉ ? thay vì phải spawn n thread

Oh, hình như cậu muốn implement graphQL, chứ không phải dùng graphQL, phải không? @Thanh_Nam_Truong

2 Likes

mình dùng graphQL bạn à , hiện tại mình đang xem cách viết query bằng rest trong cú pháp graphql vô file persons.graphQL ở mục resource , bạn có phương án nào hay hay chỉ mình tham khảo với , tk you

:smile:

Từ từ thôi cậu, tớ không thấy cậu hiểu gì hết.
Cậu đã xem link làm việc với GraphQL mà tớ đề cập ở trên chưa?
File cậu đề cập là schema, và cậu không cần viết query bằng REST API đâu.
Cậu thử làm theo link tớ đề cập ở trước xem sao.


mình sử dụng ThreadPool với mô hình newCachedThreadPool và tạo 1 arraylist có chứa các link rest API đó , rồi sử dụng ThreadPoolExecutor để execute thì bạn thấy cách này ok ko nhỉ ? thay vì phải spawn n thread

Không cậu ơi. Framework nên lo cho cậu điều đó rồi, cậu không cần tự implement lại thread pool đâu @@ (trừ khi tớ đang hoàn toàn hiểu sai điều cậu muốn làm).

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?