Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Daten per json an ein portal überübertragen

Begonnen von baumax, Februar 22, 2022, 14:08:08

⏪ vorheriges - nächstes ⏩

baumax

Hallo!
Ich möchte mit ms-Access Daten in ein gls Portal übertragen und habe von gls da einige Unterlagen erhalten für die API-Schnittstelle und einen Testaccount erhalten:

URL Testsystem: https://api-qs.gls-group.eu/

API-Endpoint: https://api-qs.gls-group.eu/public/v1/shipments

Test-Username: shipmentsapi_at

Test-Passwort: shipmentsapi_at

Test-Customer-ID:0404200001

Test-Contact-ID: 040aa2eXjW

Beispiel zur shipperId (= Customer- & Contact-ID getrennt mit einem Leerzeichen):

{

"shipperId" : "0404200001 040aa2eXjW",

Hier zwei pdf Dokumentationen der API Dokumentation: https://www.dropbox.com/sh/tppxjnjxj...ShZ7UpYka?dl=0

Ich möchte zuerst Daten von einem Kunden (Name mit Adresse) an die Schnittstelle schicke um dann ein fertiges Versandlabel als pdf zu erhalten.

Daher wollte ich fragen, ob mir jemand behilflich sein kann wie ich dies mit MS-Access umsetzen könnte und wie ich da beginnen muss.

Vielen Dank für jede Hilfe und Antwort

PhilS

Zitat von: baumax am Februar 22, 2022, 14:08:08Daher wollte ich fragen, ob mir jemand behilflich sein kann wie ich dies mit MS-Access umsetzen könnte und wie ich da beginnen muss.
Im MOF wurde dir auf dieselbe Frage der Tipp gegeben mal im Forum nach "JSON" zu suchen. - Wenn du das tun würdest, würdest du sicherlich einige Beispiele finden.


Die Kurz-Zusammenfassung:
  • Du baust einen JSON String mit den erforderlichen Daten zusammen.
  • Sendest diesen String dann über ein HTTPRequest- oder ServerXMLHTTP-Objekt unter Angabe deiner Zugangsdaten an den Endpoint der Schnittstelle.
  • Das Versandlabel-PDF erhältst du dann als Antwort von der Web-API und speicherst es lokal.

Wenn du konkretere Hilfe benötigst, dann stell bitte konkreten Fragen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

baumax

Danke für die Antwort.
Ich habe den http Request durchgeführt und habe auch eine Antwort erhalten.
Die Infos im MOF.
Mein Problem ist noch, wie ich Antwort korrekt als pdf Datei speichern kann.
Danke für eine Unterstützung.

PhilS

Zitat von: baumax am Februar 25, 2022, 19:20:40Ich habe den http Request durchgeführt und habe auch eine Antwort erhalten.
Mein Problem ist noch, wie ich Antwort korrekt als pdf Datei speichern kann.
Vermutlich hast du im JSON einen Base64 codierten String zurückbekommen.
Diesen müsstest du dekodieren und dann binär in einer Datei speichern, die dann dein PDF ist.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

baumax

Danke für die Antwort.
Ich habe da folgende Base64 Dekodierung verwendet:

'**********************
'Copyright(C) 2022 Xarial Pty Limited
'Reference: https://www.codestack.net/visual-basic/algorithms/data/encoding/base64/
'License: https://www.codestack.net/license/
'**********************

Private Function Base64ToArray(base64 As String) As Variant
   
    Dim xmlDoc As Object
    Dim xmlNode As Object
   
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    Set xmlNode = xmlDoc.createElement("b64")
   
    xmlNode.DataType = "bin.base64"
    xmlNode.Text = base64
   
    Base64ToArray = xmlNode.nodeTypedValue
 
End Function


Ich erhalte dann aber folgende Meldung in der Zeile:
xmlNode.text = base64

Laufzeitfehler '-2147467259 (80004005)':

Fehler beim Analysieren von
'{labels":["JVBERi0xLjQKJeLjz9MKMSAwIG9iaiA8PC9Db2xvclNwYWNlL0RldmljZUdyYXkvU3
als bin,.base64-Datentyp.

Wie kann ich dann den fertigen Text in ein pdf speichern.

Würde evtl. dann folgendes funktionieren:
     Open CurrentProject.path & "\test.pdf" _
         For Output As #1
        Print #1, inhalt
     Close #1

Danke für eine weitere Hilfe

PhilS

Zitat von: baumax am Februar 25, 2022, 20:01:10Laufzeitfehler '-2147467259 (80004005)':

Fehler beim Analysieren von
'{labels":["JVBERi0xLjQKJeLjz9MKMSAwIG9iaiA8PC9Db2xvclNwYWNlL0RldmljZUdyYXkvU3
als bin,.base64-Datentyp.
Der Anfang des gezeigten Wertes ({labels":[") ist JSON und nicht Teil des Base64-kodiereten Textes.

Zitat von: baumax am Februar 25, 2022, 20:01:10Wie kann ich dann den fertigen Text in ein pdf speichern.

Würde evtl. dann folgendes funktionieren:
     Open CurrentProject.path & "\test.pdf" _
         For Output As #1
        Print #1, inhalt
     Close #1
Das geht in die richtige Richtung, aber ich denke du brauchst: Open ... For Binary ... Put ...
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

baumax

#6
Danke für den Hinweis.

Hier nun mein komplettes Beispiel:

Public Sub gls()
 Dim user As String
 Dim pwd As String
 Dim path As String
 Dim i As Integer
 
 i = 0
 
 beenden = False
 
 user = "shipmentsapi_at"
 pwd = "shipmentsapi_at"
 path = "https://api-qs.gls-group.eu/public/v1/shipments"
 httpPOST path, user, pwd

End Sub


Public Function httpPOST(fn As String, _
        Optional authUser As String = vbNullString, _
        Optional authPass As String = vbNullString) As String
    pHtml = fn
    Dim body As String
   
    body = "{" & _
        """shipperId"" : ""0404200001 040aa2eXjW""," & _
        """addresses"" :" & _
        "{" & _
        """delivery"" :" & _
        "{" & _
        """name1"" : ""Test Name 1""," & _
        """street1"" : ""Test Street 1""," & _
        """country"" : ""DE""," & _
        """zipCode"" : ""10100""," & _
        """city"" : ""Berlin""" & _
        "}" & _
        "}," & _
        """parcels"" :" & _
        "[" & _
        "{" & _
        """weight"" : 2.5" & _
        "}" & _
        "]" & _
        "}"

    Dim oHttp As Object
    Set oHttp = CreateObject("Microsoft.XMLHTTP")
    Call oHttp.Open("get", pHtml, False)
    If (authUser <> vbNullString) Then
    ' need to do basic authentication
    ' acknowledgement to http://pastie.org/1192157
        oHttp.setRequestHeader "Accept-Encoding", "gzip,deflate"
        oHttp.setRequestHeader "Accept-Language", "de"
        oHttp.setRequestHeader "Content-Type", "application/json"
        oHttp.setRequestHeader "Accept", "application/json"
        oHttp.setRequestHeader "Authorization", "Basic " + _
            EncodeBase64(authUser + ":" + authPass)
    End If
   
       
    Call oHttp.Send(body)


Open CurrentProject.path & "\test.pdf" For Binary Access Write As #1
Put #1, , Base64ToArray(jsonparser(oHttp.responseText))
Close #1
Close #1

   
End Function

Function EncodeBase64(text As String) As String


  Dim arrData() As Byte
  arrData = StrConv(text, vbFromUnicode)

  Dim objXML As MSXML2.DOMDocument60
  Dim objNode As MSXML2.IXMLDOMElement

  Set objXML = New MSXML2.DOMDocument60
  Set objNode = objXML.createElement("b64")

  objNode.DataType = "bin.base64"
  objNode.nodeTypedValue = arrData

  'EncodeBase64 = Application.Clean(objNode.text)
 
  EncodeBase64 = objNode.text

  Set objNode = Nothing
  Set objXML = Nothing
End Function

'**********************
'Copyright(C) 2022 Xarial Pty Limited
'Reference: https://www.codestack.net/visual-basic/algorithms/data/encoding/base64/
'License: https://www.codestack.net/license/
'**********************

Private Function Base64ToArray(base64 As String) As Variant
   
    Dim xmlDoc As Object
    Dim xmlNode As Object
   
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    Set xmlNode = xmlDoc.createElement("b64")
   
    xmlNode.DataType = "bin.base64"
    xmlNode.text = base64
   
    Base64ToArray = xmlNode.nodeTypedValue
 
End Function

Private Function jsonparser(wert As String) As String
Dim Json As Object
Set Json = ParseJson(wert)

'Debug.Print Json("labels")(1)
jsonparser = Json("labels")(1)

End Function

Für das Parsen von json verwende ich die Info und Installation von https://github.com/VBA-tools/VBA-JSON

Das ganze wird in die Datei test.pdf gespeichert und kann problemlos geöffnet werden.

Vielen Dank für die Unterstützungen