簡體   English   中英

如何使用GraphQL架構進行類似JSON Schema的數據驗證?

[英]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. 直接使用GraphQL AST來驗證文檔,即自己編寫數據驗證器。
  2. 使用GraphQL AST生成JSON模式,並使用標准JSON模式驗證器來實際驗證它。
  3. 只是接受GraphQL不太適合驗證,並定義模式兩次 - 一次在GraphQL中進行查詢,再次在JSON Schema中進行驗證(煩人且容易出錯以保持同步)。

問題: #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.

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