首頁>技術>

Graphql 定義

GraphQL 是 API 的查詢語言,是用於現有的資料來完成查詢。

GraphQL 為 API 中的資料提供了完整且易於理解的描述,使客戶能夠準確地請求他們所需的內容。

文章背景

一個開發專案要求基於 Flask 應用 GraphQL API 進行開發,但是在開發過程中發現,部分請求涉及到上傳檔案等操作,但是眾所周知 GraphQL 對 檔案上傳的支援非常的不好,且沒有比較好用的官方包,在經過研究廢了九牛二虎之力後,終於驗證獲得了一個可行的辦法,因為知識點太過零碎,所以在這整理出來與諸位分享,希望可以幫助有需要的人!

專案所需模組
Flask==1.0.2Flask-GraphQL==2.0rc0graphene==2.1.2graphene-file-uploadaiogqlcasyncio
模組安裝方法
# Flaskpip install Flask# graphenepip install graphene# graphene_file_uploadpip install graphene-file-upload# aiogqlcpip install aiogqlc# asynciopip install asyncio
完整服務端程式碼邏輯
from flask import Flaskimport graphenefrom graphene_file_upload.scalars import Uploadfrom graphene_file_upload.flask import FileUploadGraphQLView################################################### Define the schema##################################################class Query(graphene.ObjectType): ok = graphene.Boolean(default_value=True)class MyUpload(graphene.Mutation): class Arguments: file_in = Upload() ok = graphene.Boolean() def mutate(self, info, file_in): for line in file_in: print(line) return MyUpload(ok=True)class Mutation(graphene.ObjectType): my_upload = MyUpload.Field()schema = graphene.Schema(query=Query, mutation=Mutation)################################################### Define the app##################################################app = Flask(__name__)app.add_url_rule( '/graphqlapi', view_func=FileUploadGraphQLView.as_view( 'graphql', graphiql=True, schema=schema, ))
客戶端程式碼邏輯及問題

根據找到的相關資料顯示,客戶端的請求方法案例僅僅給出了一個應用 curl 的方法,但是就實際使用而言,怎麼能讓客戶使用 curl 來請求 API 介面呢,估計會被老闆打死的,之後經過研究查詢找到了找到的應用 aiogqlc 來替代 curl 發起請求的辦法。

curl請求方法

curl http://localhost:5000/graphqlapi \\ -F operations='{"query": "mutation ($file: Upload) { myUpload(fileIn: $file) { ok }}", "variables": { "file": null }}' \\ -F map='{ "0": ["variables.file"]}' \\ -F 0=@xxxxx檔案<------這個可以寫一個檔名或者一個檔案路徑

應用 aiogqlc請求方法

from aiogqlc import GraphQLClientimport asynciomutation = ''' mutation($files: Upload) { myUpload(fileIn: $files) {  ok } }'''variables = { 'files': [ open(r'C:\\\\xxxx\\\\xxxxx\\\\xxxxx\\\\xxxxx\\\\xxxx\\\\xxxxxx.csv', 'rb'), ], 'data':None}async def foo(): client = GraphQLClient('http://127.0.0.1:5000/graphqlapi') response = await client.execute(mutation, variables=variables) print(await response.json())if __name__ == '__main__': asyncio.get_event_loop().run_until_complete(foo())
結語

上面程式碼示例僅僅是一個test case,如果諸位在應用時有什麼問題沒辦法解決,歡迎留言交流!!!

#科技新星創作營##python##軟體開發#

133

Flask

Line

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 2020,6招玩轉 Appium 自動化測試