這個賞金已經結束。此問題的答案有資格獲得 250聲望賞金。賞金寬限期在17 小時后結束。 hotmeatballsoup正在尋找有信譽的來源的答案:
賞金將獎勵給可以幫助糾正我的腳本并使查詢在其中正確執行的個人。我相信我在查詢中遺漏了一些雙引號。此外,查詢用單引號括起來,所以我不相信(請告知!)變數會正確擴展,需要轉義才能根據需要作業。
我正在嘗試撰寫一個curl針對 GraphQL API 執行的 shell 腳本,但我以前從未與 GQL 進行過互動。我遇到了一些奇怪的錯誤,雖然我知道這個社區無法訪問 GQL 服務器,但我希望有人可以查看腳本并確保我沒有在語法方面做任何明顯錯誤的事情(兩者都在shell 腳本層以及 GQL 查詢本身)。
我的腳本:
#!/bin/bash
BSEE_WEB_SERVER_DNS=https://mybsee.example.com
BSEE_API_KEY=abc123
siteId=1
scanConfigId=456
runScanQuery='mutation CreateScheduleItem { create_schedule_item(input: {site_id: "$siteId" scan_configuration_ids: "$scanConfigId"}) { schedule_item { id } } }'
runScanVariables='{ "input": "site_id": $scanId }}'
runScanOperationName='CreateScheduleItem'
curl -i --request POST \
--url $BSEE_WEB_SERVER_DNS/graphql/v1 \
--header "Authorization: $BSEE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{"query":"$runScanQuery","variables":{$runScanVariables},"operationName":"${runScanOperationName}"}'
當我從終端運行腳本時的輸出:
HTTP/2 200
<OMITTED RESPONSE HEADERS>
{"errors":[{"message":"Invalid JSON : Unexpected character (\u0027$\u0027 (code 36)): was expecting double-quote to start field name, Line 1 Col 38","extensions":{"code":3}}]}%
出于安全和簡潔的原因,我省略了 HTTP 回應標頭。
我想知道我對引號/雙引號的使用是否有某種錯誤,或者是否有任何關于 GQL 查詢本身的性質(通過 curl)看起來對任何人都不利。
我與管理服務器的團隊確認 HTTP 200 OK 回應代碼是正確的。200 表示對 GQL API 的請求已成功,但 GQL 正在回應此錯誤以指示query自身不正確。
uj5u.com熱心網友回復:
我們需要修改 GraphQL 位并修復 bash 字串參考。
runScanQuery GraphQL 操作
修復 GraphQL 語法。在引數中使用帶有變數的 GraphQL操作名稱 :CreateScheduleItem $site_id input: { site_id: $siteId, scan_configuration_ids: $scanConfigId
mutation CreateScheduleItem($site_id: String!, $scanConfigId: String!) {
create_schedule_item(
input: { site_id: $siteId, scan_configuration_ids: $scanConfigId }
) {
schedule_item {
id
}
}
}
運行掃描變數:JSON
我們的變異需要兩個變數,GraphQL 將它們替換為CreateScheduleItem($site_id: String!, $scanConfigId: String!). 以 JSON 形式提供 GraphQL 變數。這是 bash 變數替換后的預期輸出:
{ "$site_id": "1", "$scanConfigId": "456" }
正確參考 bash
最后,將輸入轉換為 bash 友好的語法:
runScanQuery='mutation CreateScheduleItem($site_id: String!, $scanConfigId: String!) { create_schedule_item(input: {site_id: $siteId scan_configuration_ids: $scanConfigId}) { schedule_item { id } } }'
runScanVariables='{"$site_id":"'"$siteId"'","$scanConfigId":"'"$scanConfigId"'"}' # no spaces!
runScanOperationName='CreateScheduleItem'
data='{"query":"'"$runScanQuery"'","variables":'$runScanVariables',"operationName":"'"$runScanOperationName"'"}'
檢查我們的 bash 格式。將終端輸出粘貼到 VSCode 等代碼感知編輯器中。期望編輯器正確決議輸出。
echo $runScanQuery # want string in graphql format
echo $runScanVariables # want JSON
echo $data # want JSON
編輯:添加一個公共 API 示例
這是一個使用公共星球大戰 API 的完整作業示例:
#!/bin/bash
filmId=1
data='{"query":"query Query($filmId: ID) { film(filmID: $filmId) { title }}","variables":{"filmId":"'"$filmId"'"}}'
curl --location --request POST 'https://swapi-graphql.netlify.app/.netlify/functions/index' \
--header 'Content-Type: application/json' \
--data "$data"
以 回應{"data":{"film":{"title":"A New Hope"}}}。
uj5u.com熱心網友回復:
在 GraphQL中,總是有 200 個狀態碼是很正常的;客戶端必須檢查回應正文以查找故障。
原因很簡單:在 REST 中,http 是協議的一部分,狀態碼具有語意,但在 GraphQL 中,http 不是協議的一部分,您可以在多個傳輸協議上使用 GraphQL:
- http:典型場景檔案
- WebSocket:不提供任何“類似狀態代碼”的有效負載。樣本
- MQTT:不提供任何“狀態碼之類”有效負載
- ...
服務器告訴您某些事情(甚至是失敗)的唯一方法是正文。
在您的情況下,我建議您jq通過 bash 腳本搜索error屬性決議 json。
uj5u.com熱心網友回復:
您的錯誤與 GraphQL 完全無關。你真的有錯誤的JSON。
錯誤訊息說Unexpected character (\u0027$\u0027 (code 36)): was Expecting double-quote to start field name, Line 1 Col 38",
您可以將轉義的 \u0027 替換為撇號,您將得到
意外字符('$'(代碼 36)):期待雙引號開始欄位名稱,第 1 行第 38 行“,
所以它討厭你作為資料發送到 curl 的第 38 位的美元符號
data='{"query":"'"$runScanQuery"'","variables":'$runScanVariables'
^
this
首先 - JSON 中的所有欄位名稱和值都應該用雙引號括起來,而不是單引號。
第二 - 如果你想 curl 擴展 env 變數,把它放在雙引號中,而不是單引號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/422928.html
標籤:
上一篇:如何在python請求中實作它?
