GraphQL und API-Call setVariable entfernt escapte Anführungszeichen

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

Hallo Stefan,


wir haben selbst schon ein paar kleine Tests mit GraphQL APIs gemacht. Das ganze ist zugegebener Maßen mit den aktuellen Steps (APICall, SpreadsheetUrlDownload und UrlDownload) eine ganz schöne "Fummelei". Bisher hatten wir noch keine weiteren Anfragen zu GraphQL, weshalb wir uns noch nicht weiter mit einer besseren Integration beschäftigt haben. Ich habe das aber mit aufgenommen und wir werden uns Gedanken darüber machen.


Was sich bei unseren Tests mit den aktuellen Mittel als hilfreich erwiesen hat, ist den Inhalt der Query (ohne das "query" : "") in einem assign Block zuzuweisen und am Ende dann über


{
  "query": "${q?json_string}"
}


auszugeben. Das Freemarker BuildIn ?json_string escaped die Anführungszeichen und ersetzt auch die Zeilenumbrüche. Das sollte auch bei dir funktionieren und das Template etwas vereinfachen.


Hier mal ein komplettes Beispiel:

![](upload://dbTfnD6wv3c2BlpNOd3LFASv5GN.png)


VG Torsten

Hallo Torsten,



das ist schon mal sehr hilfreich. Vielen Dank :)


Viele Grüße

Stefan