Das Notes Forum

HCL Notes / Domino / Diverses => Entwicklung => Thema gestartet von: schroederk am 07.03.22 - 16:34:40

Titel: Fehler bei cURL-Simulation?
Beitrag von: schroederk am 07.03.22 - 16:34:40
Hallo,

ich versuche folgenden cURL-Aufruf in Lotusscript umzusetzen:

Code
curl --request POST \
     --url https://api.signeasy.com/v2.1/original/ \
     --header 'Authorization: Bearer abc1234' \
     --header 'Accept: application/json' \
     --header 'Content-Type: application/json' \
     --data '
{
     "name": "test.pdf",
     "rename_if_exists": true,
     "file": "data:application/pdf;name=test.pdf;base64,XXXYYYZZZ"
}
'

So sieht mein entsprechender Lotusscript-Code aus:

Code
	' hole Datei als Base64-String
	Set stream = sess.CreateStream()
	Call stream.Open("c:\temp\" & filename)
	Set doc=New NotesDocument(db)
	Set mimeent = doc.CreateMIMEEntity
	Call mimeent.SetContentFromBytes(stream, "", ENC_IDENTITY_BINARY)
	Call mimeent.EncodeContent(ENC_BASE64)
	strEncodedFile = mimeent.ContentAsText()	

	Dim webRequest As NotesHTTPRequest
	Set webRequest = sess.createhttprequest()
	webRequest.maxredirects = 5
	webRequest.Preferstrings = True
	
	URL = "https://api.signeasy.com/v2.1/original/"
	content = "data:application/pdf;name=" & filename & ";base64," & strEncodedFile

	jsonBody = |{
		"name" : filename,
		"remame_if_exists" : True,
		"file" : content
	}|
	
	' headers
	Call webRequest.Setheaderfield("Authorization","Bearer abc1234")
	Call webRequest.SetHeaderField("ContentType","application/json")
	Call webRequest.SetHeaderField("Accept","application/json")
	
	ret = webRequest.Post(URL,jsonBody)

	Messagebox ret

Rückgabe ist folgende Meldung:
Missing required parameter name in json or the post body or the query string

Habe ich bei der Umsetzung noch etwas falsch gemacht?



Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 07.03.22 - 21:12:45
Ich denke es liegt am json, weichen ja stark voneinander ab ;)
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 08.03.22 - 07:21:15
Ich denke es liegt am json, weichen ja stark voneinander ab ;)

Das ist auch meine starke Vermutung, da ja auch die Fehlermeldung sagt, dass offenbar der Parameter name nicht übergeben wurde.
Ich finde leider bisher keine Beispiele, wie der Json-Code korrekt aufgebaut und übertragen werden kann.

Ich habe noch ein Beispiel gefunden, wo der json-String etwas anders aufgebaut wird, allerdings mit ebenso wenig Erfolg:

Code
	jsonBody = |{
		"name" : "|+filename+|",
		"remame_if_exists" : True,
		"file" : "|+content+|"
	}|

Hier gibts eine Anleitung für den Aufruf der API in verschiedenen Sprachen: https://docs.signeasy.com/reference/create-an-original-document (https://docs.signeasy.com/reference/create-an-original-document)

Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 08.03.22 - 07:57:03
Der JSON-Body ist immer noch falsch, boolesche Werte werden klein geschrieben.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 08.03.22 - 08:39:53
Der JSON-Body ist immer noch falsch, boolesche Werte werden klein geschrieben.

Auch das Kleinschreiben der Boolschen Werte hatte leider keinen Einfluss auf das Ergebnis. 
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 08.03.22 - 08:54:13
Übergebe mal den JSON-String direkt, so wie bei curl Befehl also ohne diesen vorher zusammenzubauen.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 08.03.22 - 09:12:28
Könnte es sein, dass es an der Länge liegt?
Wenn ich den Base64-Code der Datei direkt übergeben möchte, meckert der Designer, dass das Token zu lang sei.
Der Base64-String ist allerdings bei meinem Test nur 20K groß, zukünftige Dokumente werden sicherlich auch mal deutlich größer (Vermutlich aber immer noch im KB-Bereich)

Ein verkürzter json-String (der Base64-Code enthält damit zwangsläufig keine gültige Datei) liefert wieder dieselbe Fehlermeldung.

Code
ret = webRequest.Post(URL,"{'name' : 'test123.pdf', 'rename_if_exists' : true, 'file' : 'data:application/pdf;name=test123.pdf;base64,'AAABBBCCC'}")
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: Tode am 08.03.22 - 09:19:33
Dein String ist falsch. Er enthält ein ' zu viel vor "AAABBBCCC"

Richtig wäre:
Code
webRequest.Post(URL,"{'name' : 'test123.pdf', 'rename_if_exists' : true, 'file' : 'data:application/pdf;name=test123.pdf;base64,AAABBBCCC'}")

Unter Umständen musst Du auch den Base64- encodierten String manuell umbrechen, weil manche Systeme die Zeilenlänge beschränken...

Gemäss diesem Superuser- Post (https://superuser.com/questions/1225134/why-does-the-base64-of-a-string-contain-n) ist der Standard- Umbruch bei Base64- Dateien noch immer 76 Zeichen (früher waren Mails auf 80 Zeichen Zeilenlänge beschränkt)
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 08.03.22 - 09:22:02
Das heißt auch der curl Befehl hat so nie funktioniert?
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 08.03.22 - 10:35:15
Richtig wäre:
Code
webRequest.Post(URL,"{'name' : 'test123.pdf', 'rename_if_exists' : true, 'file' : 'data:application/pdf;name=test123.pdf;base64,AAABBBCCC'}")
Auch das Korrigieren des Fehlers hatte leider keine Auswirkung auf das Resultat  :'(

Unter Umständen musst Du auch den Base64- encodierten String manuell umbrechen, weil manche Systeme die Zeilenlänge beschränken...

Auf der Webseite von Signeasy kann man sich den cURL-Befehl zusammenstellen. Dieser enthält dort auch keine Umbrüche. Aber selbst mit nur 10 Zeichen, wo ja dann kein Umbruch benötigt wird, ändert es nichts am Ergebnis.

Das heißt auch der curl Befehl hat so nie funktioniert?

Wenn ich den cURL-Befehl von der Konsole aus absetze, bekomme ich zwar auch eine Fehlermeldung, aber eine etwas andere:
"Missing required parameter file in an uploaded file"

Da stimmt dann wohl leider auch noch etwas nicht.  :-\



Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 08.03.22 - 11:35:06
Warum baust Du dir keinen funktionierenden curl-Aufruf zusammen?
Wird doch als Hilfs-Funktion auf der API-Webseite bereitgestellt.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 08.03.22 - 11:52:27
Und wenn Du das schon so gemacht hast und der Fehler immer noch besteht, dann wäre das eine Frage an die API-Entwickler.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 08.03.22 - 13:14:54
Warum baust Du dir keinen funktionierenden curl-Aufruf zusammen?
Wird doch als Hilfs-Funktion auf der API-Webseite bereitgestellt.

Und genau das hatte ich ja bereits geschrieben, dass ich das gemacht habe.
Ich habe auch bereits eine Anfrage an deren Support gestellt. Die sitzen aber wohl in den USA, daher wird eine Antwort noch etwas dauern.
Allerdings ist die Fehlermeldung bei Lotusscript und bei cURL etwas unterschiedlich und ich würde daher gerne wissen, ob ich grundsätzlich die Übergabe der JSON-Daten korrekt aufgebaut habe.

Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: pantelis.botsas am 08.03.22 - 18:17:39
Hallo schroederk,

so auf den ersten Blick hat sich ein Tippfehler eingeschlichen:

In Deinem ersten Beispielcode steht der Parameter rename_if_exists.
Weiter unten schreibst Du aber: remame_if_exists.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 09.03.22 - 07:30:39
so auf den ersten Blick hat sich ein Tippfehler eingeschlichen:

In Deinem ersten Beispielcode steht der Parameter rename_if_exists.
Weiter unten schreibst Du aber: remame_if_exists.

Tatsächlich! Adlerauge  :o
Aber leider hat sich damit auch nichts verändert.
Ich habe leider auch noch keine Antwort vom SignEasy-Support.  :-\


Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 09.03.22 - 14:50:27
Ich habe Antwort vom Support erhalten.
Sie schrieben, ich möge doch Postman benutzen, um den Request zu erstellen.
Damit hat der Upload auch wunderbar funktioniert, allerdings sieht der cURL-Befehl etwas anders aus:

Code
curl --location --request POST 'https://api.signeasy.com/v2.1/original/' \
--header 'Authorization: Bearer uobPRV3klcoRm81pFMzxou6VYZFRJ9' \
--form 'file=@"/C:/temp/test.pdf"' \
--form 'name="test.pdf"' \
--form 'rename_if_exists="1"'

Das käme mir sogar gelegen, da ich so das File nicht erst selber als Base64-String lesen müsste.
Aber ich weiß nicht, wie ich ich das in Lotusscript im httprequest umsetzen könnte.  :-:

Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: Ralf_B am 09.03.22 - 15:25:52
Die Übersetzung von cURL nach NotesHTTPRequest ist nicht so einfach, da cURL teilweise komplette Funktionen ausführt und nicht anzeigt, dass diese Informationen mit übergeben werden. Bsp:Cookie handling. Das muss in anderen Sprachen extra programmiert werden.
Von Postman nach Notes nutze ich bislang den URL String von Postman und die Angaben unter "Headers" als NotesHTTPRequest.SetHeaderfield.
Die Params von Postman mache ich bislang in den URL String mit rein als &X=Y&V=V ......
So hat das bislang funktioniert (incl. Cookies).
Wenn die Gegenseite allerdings prüft ob da ein echter Browser die Anfrage stellt, kann das per Postman funktionieren aber nicht per Programm (e.g. OAuth SAML).
Meine Erfahrung.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 09.03.22 - 16:01:03
Von Postman nach Notes nutze ich bislang den URL String von Postman und die Angaben unter "Headers" als NotesHTTPRequest.SetHeaderfield.
Die Params von Postman mache ich bislang in den URL String mit rein als &X=Y&V=V ......

Das werde ich morgen direkt mal testen, wobei ich befürchte, dass das nicht funktioniert, da ich beim API-Aufruf ja nur ein Verzeichnis und kein Script aufrufe.
Aber die Hoffnung stirbt zuletzt.  ;)
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 09.03.22 - 17:00:34
Am Ende entsteht eine Netzwerkkommunikation die geprüft werden kann und diese API gibt es ja nicht nur für curl-Aufrufe ;)
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 10.03.22 - 08:58:57
Am Ende entsteht eine Netzwerkkommunikation die geprüft werden kann und diese API gibt es ja nicht nur für curl-Aufrufe ;)
Immer schön unkonkret bleiben  ;)

Wie meinst Du denn, dass ich die Netzwerkkommunikation prüfen soll? Mit Wireshark?

Ja, die API gibt es nicht nur für curl-Aufrufe. Inwiefern mir aber für Notes Dart, Go, C, NodesJS, Python etc. weiterhelfen soll, weiß ich nicht.
Es sei denn, dass per Lotusscript z.B. Javascript- oder Java-Code (inkl. der benötigten Bibliotheken) aufgerufen werden kann.  :-:

Von Postman nach Notes nutze ich bislang den URL String von Postman und die Angaben unter "Headers" als NotesHTTPRequest.SetHeaderfield.
Die Params von Postman mache ich bislang in den URL String mit rein als &X=Y&V=V ......

Ich hab's versucht, aber entweder akzeptiert Signeasy keine Parameterübergabe per GET oder es hatte dasselbe Ergebnis. Zumindest war die Fehlermeldung identisch.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 10.03.22 - 09:37:25
Fremde Bibliotheken sind nur in Notes ungewöhnlich, in anderen Programmiersprachen ist das quasi Standard.
So kann bei der API Beschreibung für Java  zwischen 4 Bibliotheken gewählt werden, bei Node sind es 5, JavaScript 4 ...

Das ist ein einfacher  Post-Request, das ist nichts Neues deshalb gibt es auch für alle gängigen Programmiersprachen / Bibliotheken Beispiele.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 10.03.22 - 14:45:28
Missing required parameter name in json or the post body or the query string

Ist das immer noch Deine Fehlermeldung?
Schon mal danach gegoogelt ;)
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: Tode am 10.03.22 - 14:54:39
Also ich behaupte: So lange der cURL- Befehl nicht durchläuft, brauchen wir nicht den LotusScript- Befehl debuggen... kommt ja bei beiden -sinngemäss- die gleiche Fehlermeldung (auch wenn der Wortlaut sich ganz leicht unterscheidet, aber das hängt halt von der Implementierung ab)
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 10.03.22 - 15:25:26
Der curl-Fehler "Missing required parameter file in an uploaded file" wurde mit Postman gelöst.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: schroederk am 11.03.22 - 07:06:26
Also ich behaupte: So lange der cURL- Befehl nicht durchläuft, brauchen wir nicht den LotusScript- Befehl debuggen... kommt ja bei beiden -sinngemäss- die gleiche Fehlermeldung (auch wenn der Wortlaut sich ganz leicht unterscheidet, aber das hängt halt von der Implementierung ab)

Da gebe ich Dir recht. Ich hatte gestern eine etwa 1-stündiges Videomeeting mit dem (indischen) Support von Signeasy. Dabei stellte sich (erneut) heraus, dass der cURL-Befehl von ihrer Dokumentation auch in der Shell nicht funktioniert. Der Postman cURL-Befehl nutzt ganz wahrscheinlich eine Funktion, die es in Lotusscript wohl nicht geben wird: das selbständige Laden der Datei. Ich bin mir ziemlich sicher, dass ich das vorher manuell machen und den Base64-Code mitschicken muss.
Sobald der Support mir einen funktionierenden cURL-Befehl schickt, kann ich wieder mit Lotusscript testen.
Parallel habe ich aber auch einfach mal dreist den HCL-Support involviert. Die schauen sich das auch gerade parallel an.
Titel: Antw:Fehler bei cURL-Simulation?
Beitrag von: jBubbleBoy am 11.03.22 - 07:55:00
Du hattest noch "Content-Type" falsch abgetippt.

Ich habe die Abfrage jetzt mal nachgestellt, NotesHTTPRequest schneidet seinen Inhalt immer nach ~70K ab. Mit Node / axios konnte ich auch MB-große Dateien übertragen.