Hallo zusammen,
Ich soll manche files von meinem Computer zu API service senden.
Ich weiss nicht, wie ich Send methode stellen soll.
ich weiss nicht wie ich
ublFile=@file
auf VBA ubersetzen kann
Mein code ist
Dim sendObject As New MSXML2.XMLHTTP60
Dim addresse As String
addresse = "https://myAddresse
With sendObject
.Open "POST", addresse, "False"
.setRequestHeader "accept", "text/plain"
.setRequestHeader "APIKey", "meinAPIkey"
.setRequestHeader "Content-Type", "multipart/form-data"
.send "ublFile=@" & "E:\MeinWeg\MeineDatei.xml"
Es funktioniert leider nicht.
Vielen Dank für Eure Hilfe.
Zitat von: Dex am Dezember 06, 2022, 23:53:22ich weiss nicht wie ich
ublFile=@file
auf VBA ubersetzen kann
Vielleicht zeigst du mal das Original aus dem du übersetzen willst.
Hast du mal die Rückmeldung des Services ausgewertet?
Grundsätzlich kenne ich mich damit selbst auch nicht aus.
Hab jetzt erst vor kurzem mein erstes Service für Rest-API und auch eine Anwendung die das Service nutzt geschrieben.
Da muss man sich mit solchen Details aber nicht beschäftigen.
Man nutzt die Klassen und fertig.
In diesem Fall müsste man sich schon etwas tiefer damit beschäftigen - hast du dich da mal eingelesen, oder hoffst du auf eine Copy&Paste Lösung?
Vielen Dank für Ihr Interesse an meinem Problem.
Das Teil aus der Anweisung ist
curl -X POST "https://efakturatest.mfin.gov.rs/api/publicApi/sales-invoice/ubl/upload?requestId=061720221143-upl&sendToCir=No"
-H "accept: text/plain" -H "ApiKey: d7114d70-14ca-40fe-a840-807c5353fd16" -H "Content-Type: multipart/form-data" -F
"ublFile=@TAM721TEST-test.xml;type=text/xml"
swagger site fur meinen Service ist
https://efaktura.mfin.gov.rs/swagger/index.html?urls.primaryName=Public%20API%20V1
Ich will durch meine Access Anwendung vierten oder fünften Fall machen
Ich weiss nicht, wie ich Send methode stellen soll.
Hab mal etwas gegoogelt, und diesen Thread gefunden: https://stackoverflow.com/questions/10320232/how-to-accept-a-file-post
Würde es mal so versuchen:
<script type="text/javascript">
function uploadFile() {
var xhr = new XMLHttpRequest();
var file = document.getElementById('myfile').files[0];
xhr.open("POST", "api/myfileupload");
xhr.setRequestHeader("filename", file.name);
xhr.send(file);
}
</script>
Ist zwar JavaScript - die Klasse ist aber eigentlich die selbe.
Interessant sind nur die letzten zwei Anweisungen.
Filename im Header und bei Send müsstest du ein ByteArray des Files verwenden.
Für einen ersten Test, würde ich deinen bisherigen Code bis auf die letzte Zeile übernehmen und den Rest ergänzen.
Teste das mal und Werte die Rückgabe des Services aus.
LG Markus
Hatte heute etwas Zeit und hab mal ein File-Upload in ein API-Service integriert.
Es ist auch relativ einfach festzustellen, wie man das per VBA korrekt umsetzen kann.
Mit Chrome: Einfach einen Upload mit Swagger durchführen - dann mit F12 die Entwicklertools einblenden - über Network kann man dann sehen wie Chrome den Request-Header zusammenstellt.
Damit sollte das dann einfach zu lösen sein. Senden der Daten wie bereits erwähnt.
Vielen Dank für sehr nützlichen Tipp.
Ich finde es am einfachsten die xml Datei im String zu einlesen und dann sent (Wie im vierten Fall). Es ist wichtig die Reihen mit SPACE zu abteilen. Andernfalls läuft es nicht.
Vielen Dank noch einmal.
Zitat von: Dex am Dezember 16, 2022, 22:29:10Ich finde es am einfachsten die xml Datei im String zu einlesen und dann sent (Wie im vierten Fall)
Kannst du das Beispiel und deine Umsetzung mal posten.
String finde ich etwas sonderbar, da ein String ja UTF16 nutzt.
Wie funktioniert das dann sauber, wenn das File z.B. UTF8 verwendet und eine ungrade Anzahl Bytes in Verwendung sind?
Hast du die hochgeladenen Dateien auch wieder runter geladen, oder auf einem anderen Weg geprüft ob das Ergebnis passt?
Auf solche Experimente würde ich mich ohne Zwang nicht einlassen und es gibt ja auch absolut keinen Grund dafür, bzw. würde ich es prüfen, was mir ja leicht fällt da ich im Service ja direkt debuggen kann.
Zitat von: markusxy am Dezember 17, 2022, 14:08:49String finde ich etwas sonderbar, da ein String ja UTF16 nutzt.
Wie funktioniert das dann sauber, wenn das File z.B. UTF8 verwendet und eine ungrade Anzahl Bytes in Verwendung sind?
Es funktioniert wahrscheinlich deshalb (Zitat von
send Method (IXMLHTTPRequest) (https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms763706(v=vs.85))):
ZitatIf the input type is a BSTR, the response is always encoded as UTF-8. The caller must set a Content-Type header with the appropriate content type and include a charset parameter.
(Wenn man den vollständigen Text liest, liegt nahe dass mit "response" eigentlich "request" gemeint ist.)
@PhilS, interessant.
So wie ich es verstanden habe, hängt er ja mehrere Files zusammen.
Da fehlt mir die Erfahrung um zu sagen ob das problematisch sein kann.
Man könnte ja auch einen Ansi-BSTR verwenden. Der wird ja bytegenau erstellt - geht aber kaum ohne API - außer man erstellt den String mit dem Array.
Warum dann nicht gleich ein Array verwenden oder mit einer Stream-Klasse arbeiten.
LG M
Edit: Werde es die nächsten Tage mal mit beiden Varianten testen - auch mit mehreren Files. So wie es aussieht kann man das dann aber nicht 1:1 mit dem Swagger vergleichen. Spannender wird es vermutlich wenn man gemischte File-Formate hat.
Zitat von: markusxy am Dezember 17, 2022, 14:24:18Man könnte ja auch einen Ansi-BSTR verwenden.
Ein BSTR (https://learn.microsoft.com/en-us/previous-versions/windows/desktop/automat/bstr) ist immer Unicode (Microsoft Unicode = UTF16LE).
Was hier das letzte konkrete Beispiel ist, um das es hier im Thread geht, und wie welche/wieviele Dateien involviert sind, kann ich ehrlicherweise hier nicht mehr nachvollziehen.
Zitat von: PhilS am Dezember 17, 2022, 14:35:29Ein BSTR ist immer Unicode (Microsoft Unicode = UTF16).
Zur Info:
Kann man auch in VBA verwenden, wenn man will.
https://learn.microsoft.com/en-us/windows/win32/api/oleauto/nf-oleauto-sysallocstringbytelen
https://learn.microsoft.com/en-us/windows/win32/api/oleauto/nf-oleauto-bstrfromvector
Wenn du ein Array mit ungerader Byte Zahl in einen String umwandelst, kommt auch ein String mit ungrader Bytezahl raus. Prüfung geht dann nur über lenb
Entschuldigung, mein Fehler, Ich meinte den fünften Fall aus dem Swagger.
Auf ersten Blick hat es einfacher ausgesehen den vierten Fall zu machen. Man sollte nur path to file zu senden, aber ich könnte den Code, der funktioniert nicht stellen.
Zitat von: markusxy am Dezember 17, 2022, 14:24:18So wie ich es verstanden habe, hängt er ja mehrere Files zusammen.
Nein, ein Request - ein File.
Die Procedure kann natürlich mehrfach für verschiedene Fles verwendet werden.
Der Code für den fünften Fall ist
Dim ReqBody as String
Dim temp as string
Open PathToFile & ".xml" For Input As 1
While Not EOF(1)
Line Input #1, temp
ReqBody = ReqBody & temp
Wend
ReqBody = Replace(ReqBody,"><",> <")
Dim sendObject As New MSXML2.XMLHTTP60
Dim addresse As String
addresse = "https://myAddresse"
With sendObject
.Open "POST", addresse, "False"
.setRequestHeader "accept", "text/plain"
.setRequestHeader "APIKey", "meinAPIkey"
.setRequestHeader "Content-Type", "application/xml"
.send ReqBody
end with
Ich habe es ausprobiert und es funktioniert.