Neues Thema starten

REAL API

 Hallo zusammen,


ich würde gerne  Tickets direkt über die Real API abrufen, scheitere aber noch an der HM-Signature, bzw. wie ich den UNIX timestamp so einbinde, dass der Request auch zu einem Ergebnis führt.


Hat hier jemand einen Tipp?


Beschrieben ist es hier: https://www.real.de/api/v1/?page=rest-api


Danke für eure Hilfe vorab und Grüße

Enrico


So, nun die hoffentlich letzte Frage, sorry dass ich so nerven muss.


Ich habe das nun auf meinen Fall umgebaut und kann damit tatsächlich 2 calls machen und bekomme entsprechend Ergebnisse zurück.

Nach dem 2ten Call hört das ganze auf, ich denke weil hier:

${nextUrl(initialUrl?replace("offset=1","") + "offset=" + incCounter('myCounterInUrl',1) )}

nur "offset=1" ersetzen. mit welchem Ausdruck baue ich denn hier die Funktion ein, dass "offset=1" aus der URL bei den nächsten Calls auch hochgezählt wird. Denn es müsste ja weiterzählen zu "offset=2"...etc wenn ich den Befehl zum ersetzen gebe. Das passiert aber nicht, egal wie ich den Counter da einbaue.


VG

Enrico


Bist du in der Step-Vorschau? Da werden maximal 2 Calls gemacht. Probier mal, ob bei einer echten Flow-Ausführung mehr passiert. 

Ja, war ich - beim Ausführen macht er tatsächlich mehr. Und wie erhöhe ich nun die Zahl die er als nächstes machen muss. Wenn ich in den countern 30 eingeben, so dass er immer 30 hochzählt, dann bekomme ich wieder das problem dass er die Signatur nicht mehr nimmt. 

Hmm also vielleicht ist der Counter nicht so das richtige Mittel der Wahl und setVariable() / getVariable() vielleicht besser.


Der Ansatz mit setVariable() wäre, dass du initial einen <#if> Check machst, ob es deine Variable "offset" schon gibt und wenn nicht beginnst du bei offset=0 (oder so).


Hier mal ein Beispiel, womit du in der URL, im RequestBody und im RequestHeader konsistent das offset setzen kannst.


host:

https://demodata.synesty.com/example-json-orders.json?offset=<#if getVariable('offset')! == "">0<#else>${getVariable('offset')}</#if>



body:


<#assign row = target.addRow()>
<#list json as j >
 <#assign row = target.addRow()>
 ${addColumns(row, j)}
</#list>


${setVariable("offset", (callcounter + 1) * 30 )}
${nextUrl(initialUrl?replace("offset=0","") + "offset=" + getVariable('offset') )}


requestHeader:


offset=<#if getVariable('offset')! == "">0<#else>${getVariable('offset')}</#if>




Ergebnis sind calls wie diese:


[GET https://demodata.synesty.com/example-json-orders.json?offset=0

RequestHeaders:
{offset=0}



GET https://demodata.synesty.com/example-json-orders.json?offset=30

RequestHeaders:
{offset=30}


Ergänzung (evtl. für andere, die es noch nicht wissen):

Die hier verwendeten Variablen wie z.B. callcounter sieht man bei Klick auf den Plus-Button im requestBody sowie 




Hallo Enrico,


ich habe mal ein Beispiel erstellt wie das mit der HM Signatur funktionieren könnte.


<#assign method = "POST">
<#assign uri = "https://www.real.de/api/v1/units/">
<#assign body = "">
<#assign timestamp = 1411055926>
<#assign gesamt>${method}${"\n"}${uri}${"\n"}${body}${"\n"}${timestamp}</#assign>
${gesamt}
<#assign secret ="a7d0cb1da1ddbc86c96ee5fedd341b7d8ebfbb2f5c83cfe0909f4e57f05dd403">
${hmacSHA256(gesamt, secret, "hex")!}
75312eabe66e4b9e74552a5e8959456d69cfa52a7cae9049093aede4bcdf71e7

Viele Grüße

Stefan Helme

Hallo Stefan,


danke schonmal hierfür. Kannst du mir auch sagen, wie ich die Aktuelle Zeit als Unix-Zeit in rein bekomme. Irgendwas klappt hier bei der Umwandlung nicht.


Danke und Grüße

Enrico

Hallo Enrico,


den aktuellen UNIX Timestamp bekommst du über folgenden Ausdruck: 


<#assign unix = (.now?long / 1000)?split(".")[0]>



Viele Grüße

Stefan Helme 

Ich nochmal,


Wenn ich mir das ganze nun in einen TextHtmlWriter packe, wie sage ich hier, dass ich das Ergebnis von Timestamp und die Signature als "output" darstelle. Denn ich muss die Ergebnisse dann ja im ApiCall step in klartext in den Header schreiben. Im Moment bekomme ich als Feedback immer nur:


(Unauthorized), Inhalt Antwort: {"message":"API Client is not set"}


VG

Enrico


Hallo Enrico,


soweit ich dich richtig verstehe willst du mehrere Werte aus dem HTMLTextWriter rausbekommen.

Du könntest in der Theorie entweder die Werte Kommasepariert rauschreiben und das ganze als CSV nochmal einlesen. Du hast dann die Möglichkeit auf die Werte zuzugreifen.
Alternativ schreibst du alles in ein JSON und und parset das dann im Header wieder. Das würde zum Beispiel so aussehen: 

  

<#assign method = "POST">
<#assign uri = "https://www.real.de/api/v1/units/">
<#assign body = "">
<#assign timestamp = 1411055926>
<#assign gesamt>${method}${"\n"}${uri}${"\n"}${body}${"\n"}${timestamp}</#assign>
<#assign secret ="a7d0cb1da1ddbc86c96ee5fedd341b7d8ebfbb2f5c83cfe0909f4e57f05dd403">
<#assign signature = hmacSHA256(gesamt, secret, "hex")!>
{
"timestamp": "${timestamp}",
"signature" : "${signature}"
}

 

Im zweiten Schritt gehst du dann hin und und parsest das ganze im Header 

wie folgt 

  

<#assign output = htmlWriterOutput?eval> <#-- hier musst du den htmlWriterStep verlinken -->
HM-Signature=${output.signature}
HM-Timestamp=${output.timestamp}

 Wenn du das ganze aber Zeilenbasiert machen musst und du für jeden Call die Signatur neu berechnen musst, würde es sich anbieten die Signatur immer im Spreadsheetmapper zu berechnen.


Ich habe das ganze jetzt natürlich nicht ausprobiert, weil ich keinen Zugriff auf die REAL API habe, deswegen müsstest du das ein wenig rumprobieren bis es klappt.

In der Theorie sollte aber das generieren der Signatur (wie im ersten Post beschrieben) funktionieren, denn die vorgegebenen Testwerte aus der Doku stimmen mit dem hier generierten Ergebnis überein.


Viele Grüße

Stefan 

Hi Stefan,


heute stehe ich mir irgendwie selber auf den Füßen.


Im JSON ist es denke ich die beste Variante, allerdings funktioniert das Parsen im Header noch nicht. Er scheint ein Problem mit der Verlinkung zu Writer zu haben.


Wenn ich mir die Vorschau anzeigen lasse vom Writer zeigt er mir

TEMPLATE_OUTPUT_STRING@TextHTMLWriter_17


Wenn ich das aber einbaue sagt er mir er hat einen String Fehler. Muss ich das in die Zeile mit assign output irgendwie anders einbauen als es in der Vorschau Ausgabe steht?

Dankeund Grüße
Enrico

Hallo Enrico,


könntest du mir bitte ein paar Screenshots zukommen lassen? Besonders von der Fehlermeldung wäre gut.

Bei mir sieht das so aus: 

image


image

image

image



Viele Grüße

Stefan 

Hallo Stefan,


ich habe den Fehler gefunden, hatte noch < zuviel drin, daher ging es nicht.

Nun will ich den Header so in den Apicall bauen. Muss ich dafür noch eine KEY,Value Varable setzen oder sollte der Abruf im Header so funktionieren?:


image

Die Zugangsdaten von der Real Api sollten eigentlich als Test funktionieren, allerdings habe ich weiterhin:

HTTP Status: 401 (Unauthorized), Inhalt Antwort: {"message":"API Client is not set"}


Grüße

Enrico

Hallo Enrico, 


ich bin mir nicht sicher ob das einen Unterschied macht, aber soweit ich weiß sind die Anführungszeichen um die Key-Value Paare nicht notwendig.

Weiterhin sehe ich noch, dass dein Accept Key klein geschrieben ist. Ich nehme an der muss groß sein. 

Das sieht dann so aus: 

image


Danach bekomme ich zwar immer noch einen "Wrong Client Key set", ich nehme hier aber mal an, dass das tatsächlich daran liegt, dass der in der Doku vorgegebene Client Key nicht valide ist. Heißt du musst das dann mit deinem eigenen Client/Secret Testen.

Ich bekomme immerhin selbige Fehlermeldung wenn ich das über das Testmodul von Real probiere: 

image



Viele Grüße

Stefan

Hi Stefan,


ich habe die beiden Keys nun durch gültige ersetzt, allerdings immernoch der selbe Fehler.

Wenn du mir sagst wo, dann gebe ich dir die Keys per Nachricht durch, eventuell kannst du noch etwas testen.


VG

Enrico

Anmelden um einen Kommentar zu veröffentlichen