Code im POST APICall

Hallo Team, zuweilen möchte ich im o.a. Call Code verwenden - leider wird dieser dann aber mit übertragen, was zu einem ungültigen JSON Body führt. Beispiel:


Der zu übertragende Code ist:


{

"stock_quantity":1

}


Sagen wir, die "1" soll aber aus einem Array geholt werden, das vorher in einem TextHtmlWriter erzeugt und im APICall dann referenziert wird, z.B.


<#assign values2 =[]><#assign stocks = "${TEMPLATE_OUTPUT_STRING@TextHTMLWriter_54!}"><#list stocks?split(',') as stocktest><#assign values2 +=[stocktest]></#list><!-- liest eine Reihe von kommagetrennten stocks in ein Array ein -->

<#if !getVariable('a')?has_content>${setVariable('a','0')}</#if><!-- für den ersten Call -->

<#assign c = getVariable('a')?number><!-- liest beim ersten Call den ersten Stocks-Wert aus -->

{
"stock_quantity":${values2[c]}
}
${setVariable('a',getVariable('a')?number +1)}


Danach kommt noch die Abfrage, ob das Array an der neuen Stelle noch einen Wert hat ==> dann wird eine nextUrl definiert, habe ich hier nicht ausgeführt.


Wenn ich diesen Call nun abschicke, läuft er in einen Fehler, weil einige Stellen des Codes Daten erzeugen, die dann den Call versauen; konkret kommt z.B. raus:


[{"code":"rest_invalid_json","message":"Ung\u00fcltiger JSON body \u00fcbergeben.","data":{"status":400,"json_error_code":4,"json_error_message":"Syntax error"}}]

requestBody:

0
{
"stock_quantity":1
}
1


Die Null ist das Ergebnis der Codezeile ${setVariable('a','0')},

die Eins ist Ergebnis von ${setVariable('a',getVariable('a')?number +1)}


Wie kann ich den Code verwenden, aber verhindern, daß er beim eigentlichen Request mitgeschickt wird?


Gruß Micha

Du kannst versuchen, mittels keep_after aus dem Rückgabewert der setVariable-Funktion einen leeren String zu erstellen. keep_after gibt einen leeren String zurück, wenn der String-Parameter nicht gefunden wird. Einfach nach irgendeiner Folge an Buchstaben oder Sonderzeichen suchen, die wird ja nie in Zahlen vorkommen.

Also aus dem Aufruf ${setVariable('a','0')} wird ${setVariable('a','0')?keep_after('Irgendein Text')}.


Das sollte dein Problem eigentlich lösen. Vielleicht hat das Synesty-Team auch noch einen besseren Vorschlag.

Geil, klappt perfekt. Vielen Dank!

Hallo Micha,


soweit ich mich nicht irre, sollte das ganze auch per #assign funktionieren.

Also <#assign temp = setVariable('a',getVariable('a')?number +1)>

Ich hatte ein wenig nachgeforscht, ob man eine Template Funktion aufrufen kann, ohne das Ergebnis davon auszugeben. Leider habe ich aber nur die Möglichkeit per #assign gefunden. Das wäre dann auch ein wenig allgemein-gültiger und nicht abhängig vom Rückgabewert, der Template Funktion.


Ob es hier einen besseren Lösungsweg gibt, würde mich auch sehr interessieren. Vielleicht hat ja das Synesty Team hier einen passenderen Vorschlag.


Viele Grüße

Stefan

Kurze Info: Wir prüfen gerade, ob wir die Ausgabe bei setVariable() im APICall entfernen können. Warum das in erster Instanz so gemacht wurde, lässt sich nicht mehr sagen. Aber es ist vermutlich eher eine "Unschönheit" oder Inkonsistenz. Die andere setVariable Funktion im Mapper hat z.B. keine Ausgabe.