簡體   English   中英

graphql-具有不同參數的相同查詢

[英]graphql- same query with different arguments

可以使用圖形 ql 實現以下內容:我們有getusers() / getusers(id=3) / getusers(name='John) 我們可以使用相同的查詢來接受不同的參數(參數)嗎?

我假設你的意思是這樣的:

type Query {
    getusers: [User]!
    getusers(id: ID!): User
    getusers(name: String!): User
}

恕我直言,首先要做的是嘗試。 您應該收到一條錯誤消息,指出Query.getusers只能定義一次,這將立即回答您的問題。

這是實際規范說這樣的事情是無效的: http : //facebook.github.io/graphql/June2018/#example-5e409

引用:

每個命名操作定義在通過其名稱引用時在文檔中必須是唯一的。

解決方案

根據我所見,創建此類 API 的最GraphQL方法是定義過濾器輸入類型,如下所示:

input UserFilter {
    ids: [ID]
    names: [String]
}

進而:

type Query {
    users(filter: UserFilter)
}

解析器將檢查通過了哪些過濾器(如果有)並相應地查詢數據。

這非常簡單但非常強大,因為它允許客戶端使用任意過濾器查詢任意數量的用戶。 作為后端開發人員,您可以稍后向UserFilter添加更多選項,包括一些分頁選項和其他很酷的東西,同時保持舊 API 不變。 而且,當然,這取決於您希望此 API 有多靈活。

但為什么會這樣呢?

警告! 我在這里和那里假設了一些事情,可能是錯誤的。

GraphQL 只是一個邏輯 API 層,它應該是與服務器無關的。 但是,我相信最初的實現是在 JavaScript 中(需要引用)。 如果您隨后考慮在 JS 中實現 GraphQL API 的技術方面,您可能會了解為什么會這樣。

每個查詢都指向一個解析器函數。 在 JS 中,解析器是簡單的函數,它們存儲在由查詢/變異/訂閱名稱指定的路徑中的普通對象中。 您可能知道,JS 對象不能有多個同名的路徑。 這意味着您只能為給定的查詢名稱定義一個解析器,因此無論如何,所有三個getusers都會映射到同一個函數Query.getusers(obj, args, ctx, info)

因此,即使 GraphQL 允許具有相同名稱的字段,解析器也必須明確檢查傳遞的任何參數,即if (args.id) { ... } else if (args.name) { ... } ,等等,從而部分地擊敗了具有單獨端點的點。 另一方面,有一種總體上更好的方式(特別是從客戶的角度來看)來定義這樣的 API,如上所示。

最后說明

GraphQL 在概念上與 REST 不同,因此從三個端點(/users、/users/:id 和 /users/:name)的角度來思考是沒有意義的,我猜你正在這樣做。 為了揭示語言的全部潛力,需要進行范式轉變。

該類型的請求有效:

Query {
    first:getusers(), 
    second:getusers(id=3)
    third:getusers(name='John)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM