Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Dex am Dezember 06, 2022, 23:53:22

Titel: send file zu API
Beitrag von: Dex am Dezember 06, 2022, 23:53:22
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.
Titel: Re: send file zu API
Beitrag von: markusxy am Dezember 08, 2022, 15:30:51
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?

Titel: Re: send file zu API
Beitrag von: Dex am Dezember 09, 2022, 21:59:07
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.
Titel: Re: send file zu API
Beitrag von: markusxy am Dezember 10, 2022, 13:29:01
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
Titel: Re: send file zu API
Beitrag von: markusxy am Dezember 12, 2022, 17:52:18
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.
Titel: Re: send file zu API
Beitrag von: Dex am Dezember 16, 2022, 22:29:10
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.

Titel: Re: send file zu API
Beitrag von: markusxy am Dezember 17, 2022, 14:08:49
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.
Titel: Re: send file zu API
Beitrag von: PhilS am Dezember 17, 2022, 14:17:59
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.)

Titel: Re: send file zu API
Beitrag von: markusxy am Dezember 17, 2022, 14:24:18
@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.
Titel: Re: send file zu API
Beitrag von: PhilS am Dezember 17, 2022, 14:35:29
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.
Titel: Re: send file zu API
Beitrag von: markusxy am Dezember 17, 2022, 14:39:02
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
Titel: Re: send file zu API
Beitrag von: Dex am Dezember 18, 2022, 15:12:46
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.