Hallo Synesty,
ich benutze unter anderem GraphQL um mit einem unserer WMS zu kommunizieren.
Ein GraphQL besteht aus einem JSON in der der GrahQL Body übergeben wird:
{
"query": "${graphqlBody}"
}
Der GraphQL Body muss letzten Endes in einer Zeile als String übergeben werden.
Das heißt alle Zeilenumbrüche werden durch ein \n ersetzt.
Alle Anführungszeichen müssen escapt werden: \"
Um nun das gewünschte Ergebnis im Synesty-API Call zu bekommen, muss ich Anführungszeichen doppelt escapen: ${"\\\""}
Da ich hier über ein Token, dass ich aus dem vorherigen Call bekomme, paginieren muss, musste auch dieses Token wie oben beschrieben in Anführungszeichen packen. Also habe ich das bereits beim Parsen gemacht:
<#assign endToken = ", after: \\\"" + json['nextToken'] + "\\\">
Wenn ich dann setVariable("nextToken",endToken) verwendet habe, um das Ergebnis mit den nächsten Call zu übernehmen, bekomme ich einen Error. Der HTTP-Log gibt her, dass die Anführungszeichen um den endToken fehlen.
Scheinbar werden die beim Setzen über setVariable entfernt.
Das habe ich dann Gelöst, in dem ich statt dem fertigen Teil des Bodies mit escapten Strings zu übergeben, nur den reinen Token übergebe und eine zusätzliche Logik im HTTPBody einbaue:
data(first: ${ItemsProCall!} <#if nextCursor != "">, after: ${"\\\""}${nextCursor}${"\\\""}</#if>)
Das ganze Wrappe ich dann in eine eigene Variable und "crunche" das auf ein Zeile, in dem ich alle Zeilen umbrüche entferne.
Ganz am Ende sieht mein Body dann so aus:
<#assign test> { "query":"{ products { complexity data(first: ${ItemsProCall!} <#if nextCursor != "">, after: ${"\\\""}${nextCursor}${"\\\""}</#if>) { pageInfo{ endCursor hasNextPage } edges { cursor node { id sku barcode account_id name warehouse_products { on_hand warehouse_identifier warehouse_id inventory_bin inventory_overstock_bin reserve_inventory replenishment_level reorder_amount reorder_level custom } } } } } } "} </#assign>${test?replace("\r\n","","r")}
Ehrlich gesagt, ist das sehr viel Fummelei um das zum laufen zu bringen.
Besonders, weil ich fertige CURL Calls, mit eurem HTTP-Log und dem übergebenen Body vergleichen musste um hier das richtige Format hinzubekommen.
Geht das nicht noch irgendwie besser? Habt ihr euch schon mal mit GraphQL näher beschäftigt? Ich hatte die Doku bereits durchsucht, aber nichts finden können.
Viele Grüße
Stefan