Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: baumax am Februar 22, 2022, 14:08:08

Titel: Daten per json an ein portal überübertragen
Beitrag von: baumax am Februar 22, 2022, 14:08:08
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
Titel: Re: Daten per json an ein portal überübertragen
Beitrag von: PhilS am Februar 22, 2022, 14:21:13
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:

Wenn du konkretere Hilfe benötigst, dann stell bitte konkreten Fragen.
Titel: Re: Daten per json an ein portal überübertragen
Beitrag von: baumax am Februar 25, 2022, 19:20:40
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.
Titel: Re: Daten per json an ein portal überübertragen
Beitrag von: PhilS am Februar 25, 2022, 19:43:25
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 (https://www.google.com/search?q=base64+decode+VBA) und dann binär in einer Datei speichern, die dann dein PDF ist.
Titel: Re: Daten per json an ein portal überübertragen
Beitrag von: baumax am Februar 25, 2022, 20:01:10
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
Titel: Re: Daten per json an ein portal überübertragen
Beitrag von: PhilS am Februar 25, 2022, 20:21:21
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 ...
Titel: Re: Daten per json an ein portal überübertragen
Beitrag von: baumax am Februar 25, 2022, 20:37:49
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