[英]How to use a GraphQL schema for JSON Schema-like data validation?
我們正在研究將GraphQL用於我們正在開發的無頭CMS的第2版。
在這個CMS的第1版中,我們使用JSON Schema在保存到數據庫之前根據模式驗證每個文檔 - 例如,如果它是博客文章,它將根據Article
模式進行驗證,如果它是一個綜合( “最好的”列表)它將根據Roundup
架構進行驗證。
對於版本2,我們正在考慮將GraphQL用於API。 然后我們發現GraphQL模式基本上與JSON模式並行 - 它描述了文檔結構,字段類型等。
因此,我們可以簡單地使用“一個模式真實來源”,即GraphQL模式,並在保存新版本時使用它來查詢文檔和驗證新文檔。 (請注意,我正在討論針對GraphQL架構驗證JSON數據,而不是針對架構驗證GraphQL查詢。)
我認為數據將針對架構中的所有字段進行驗證,但已棄用的字段除外,因為您只想驗證字段的“最新版本”。
我們可以做以下三件事之一:
問題: #1和#2愚蠢的想法? 是否有任何GraphQL工具可以進行這種數據驗證? 如果沒有定義兩次架構,還有其他方法可以實現嗎?
作為參考,我們的后端將用Python編寫,但管理UI將是客戶端的React和JavaScript。 這是我們正在討論的GraphQL架構的縮減版本(支持“Article”和“Roundup”文檔類型):
schema {
query: Query
}
type Query {
documents: [Document!]!
document(id: Int): Document!
}
interface Document {
id: Int!
title: String!
}
type Article implements Document {
id: Int!
title: String!
featured: Boolean!
sections: [ArticleSection!]!
}
union ArticleSection = TextSection | PhotoSection | VideoSection
type TextSection {
content: String!
heading: String
}
type PhotoSection {
sourceUrl: String!
linkUrl: String
caption: String
content: String
}
type VideoSection {
url: String!
}
type Roundup implements Document {
id: Int!
title: String!
isAward: Boolean!
intro: String
hotels: [RoundupHotel!]!
}
type RoundupHotel {
url: String!
photoUrl: String @deprecated(reason: "photoUrl is deprecated; use photos")
photos: [RoundupPhoto!]!
blurb: String!
title: String
}
type RoundupPhoto {
url: String!
caption: String
}
GraphQL仍然是一種不斷發展的技術( 正如它在規范文檔頂部所說的那樣 ),因此可以肯定地說,沒有真正“正確”的答案。
InputObject類型(接口定義語言術語中的“輸入”)與列表(IDL術語中的“[]”)以及各種標量似乎完全涵蓋了您可以在JSON中執行的操作。
如果GraphQL的Python實現符合規范,那么提供數據作為GraphQL文字或(更好)作為“變量”應該提供自定義驗證所能提供的一切:GraphQL驗證將做正確的事情。
根據我迄今為止使用GraphQL的工作,我的建議是“順其自然”。 如果您的GraphQL架構符合您的數據架構所需,只需使用普通的GraphQL驗證。 如果您確實進行了自己的驗證,那么應該在 GraphQL完成正常的數據形狀檢查之后進行驗證。
總結以上幾點,並用一個問題回答你的問題:讓GraphQL正常運行有什么問題呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.