Hallo,
ich versuche folgenden cURL-Aufruf in Lotusscript umzusetzen:
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:
' 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?
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:
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)
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.
ret = webRequest.Post(URL,"{'name' : 'test123.pdf', 'rename_if_exists' : true, 'file' : 'data:application/pdf;name=test123.pdf;base64,'AAABBBCCC'}")
Dein String ist falsch. Er enthält ein ' zu viel vor "AAABBBCCC"
Richtig wäre:
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)
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:
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. :-: