XmlHttpRequest – REST API - VBA

di il
9 risposte

XmlHttpRequest – REST API - VBA

Salve a tutti,

sto cercando di reperire dei dati tramite un API pubblica che poi vorrò manipolare successivamente.

Ho inserito i corretti riferimenti in Access.

Riesco ad inviare la richiesta e ricevo anche la risposta ma non riesco a passare dei parametri che mi permettano di ricevere i dati della pagina che mi interessa (i dati sono restituiti in blocchi di 50 record per volta).
La documentazione a cui ho accesso indica esplicitamente che la rechiesta consente il parametro "page" che accetta valori numerici e che identificano la pagina che si richiede.

il codice è il seguente:

Dim xmlHTTP As New MSXML2.XMLHTTP60
Dim url As String
Dim user As String
Dim password As String
Dim pagina As Integer

Set xmlHTTP = CreateObject("Msxml2.XMLHTTP.6.0")
Set xmldoc = CreateObject("Msxml2.DOMDocument.6.0")

pagina = 2
url = "https://sito.com/v1/properties/list"
user = "nomeutente"
password = "pwdutente"
token = "TokenApi"

xmlHTTP.Open "POST", url, False, user, password

xmlHTTP.setRequestHeader "X-Api-User", user
xmlHTTP.setRequestHeader "X-Api-Pwd", password
xmlHTTP.setRequestHeader "X-Api-Key", token

xmlHTTP.send ("page=" & pagina)
MsgBox (xmlHTTP.responseText)

Set xmlHTTP = Nothing
la risposta ritorna sempre la pagina 1 indipendentemente dal valore della variabile "pagina".


Qualcuno con maggiori conoscenze rispetto alle mie può suggerirmi come risolvere o comunque una strada possibile per approfondire la cosa?

Vi ringrazio in anticipo per l' aiuto.

Un saluto

Andrea

9 Risposte

  • Re: XmlHttpRequest – REST API - VBA

    Così non ti so rispondere, non sarebbe male avere indicazioni dalla documentazione relativa all'URL/servizio, hai nulla?
    ps: ricordati di usare i TAG CODE per postare codice o citare
  • Re: XmlHttpRequest – REST API - VBA

    Ciao, scusami per i TAG. Non mi ero accorto.

    La documentazione è piuttosto scarna e per i parametri vengono indicati i seguenti dettagli:


    X-Api-User: deve essere inviato al server in tutte le richieste.
    X-Api-Pwd: deve essere inviato al server in tutte le richieste.
    X-Api-Key: deve essere inviato al server in tutte le richieste.
    X-Api-Lang: [opzionale] determina la lingua in cui verranno restituiti i dati, default it.
    output: accetta la stringa json o xml e determina il formato della risposta.
    items_perpage: accetta un valore numerico da 1 a N e determina il numero di elementi per ogni pagina.
    page: accetta un valore numerico e determina il numero della pagina richiesta.



    Grazie.

    Andrea
  • Re: XmlHttpRequest – REST API - VBA

    Sei assolutamente certo che esista una pagina 2 da scaricare?
  • Re: XmlHttpRequest – REST API - VBA

    Ho provato a fare la richiesta usando il sito Postman e riesco a passare il parametro correttamente.
    come vedi dalla parte iniziale della risposta che ricevo e che trovi di seguito (in questo caso ho chiesto la pagina di 2 delle 14 totali):

    "response": {
    "result": "OK",
    "error": "",
    "items": 691,
    "returneditems": 50,
    "pages": 14,
    "currentpage": 2
    },


    Il sito Postman permette anche di vedere uno snippet in vari linguaggi e non capisco perchè non funzioni con VBA (ma questo non sarebbe strano visto che non sono un programmatore professionista ).

    Se qualcuno vuol vedere il codice che ha generato Postman in python oppure in php lo posto.

    Grazie ancora per l' aiuto.
  • Re: XmlHttpRequest – REST API - VBA

    Se qualcuno vuol vedere il codice che ha generato Postman in python oppure in php lo posto.
    procedi pure
  • Re: XmlHttpRequest – REST API - VBA

    Snippet in python
    
    import requests
    
    url = "https://sito.com/v1/properties/list"
    
    payload={'items_perpage': '50',
    'page': '2'}
    files=[
    
    ]
    headers = {
      'X-Api-User': 'NomeUtente',
      'X-Api-Pwd': 'PwdUtente',
      'X-Api-Key': 'TokenAPI'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload, files=files)
    
    print(response.text)
    

    Snippet in php
    
    <?php
    
    $curl = curl_init();
    
    curl_setopt_array($curl, array(
      CURLOPT_URL => 'https://sito.com/v1/properties/list',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_POSTFIELDS => array('items_perpage' => '50','page' => '2'),
      CURLOPT_HTTPHEADER => array(
        'X-Api-User: nomutente',
        'X-Api-Pwd: pwdutente',
        'X-Api-Key: tokenApi'
      ),
    ));
    
    $response = curl_exec($curl);
    
    curl_close($curl);
    echo $response;
    
  • Re: XmlHttpRequest – REST API - VBA

    Non risolve la questione ma sarebbe giusto per capire se il send funziona prova a sostituire la tua
    xmlHTTP.send ("page=" & pagina)
    
    con
    xmlHTTP.send ("items_perpage=10")
    
    e vedi se te ne restituisce solo 10 invece che 50


    oppure anche entrambi contemporaneamente, nei 2 codici funzionanti vengono inviati entrambi contemporaneamente ... 'n si sa mai
  • Re: XmlHttpRequest – REST API - VBA

    Purtroppo non risolve.

    Non riesco a capire perchè non funzioni.

    Cercherò di gestire la cosa al di fuori di Access.

    Grazie.

    Un saluto
  • Re: XmlHttpRequest – REST API - VBA

    Vigand ha scritto:


    Salve a tutti,
    sto cercando di reperire dei dati tramite un API pubblica che poi vorrò manipolare successivamente.
    [...]
    Riesco ad inviare la richiesta e ricevo anche la risposta ma non riesco a passare dei parametri che mi permettano di ricevere i dati della pagina che mi interessa (i dati sono restituiti in blocchi di 50 record per volta).
    [...]
    la risposta ritorna sempre la pagina 1 indipendentemente dal valore della variabile "pagina".
    Direi che è un chiaro segnale che i parametri non vengono "catturati" dal server, ed essendo (quasi) sicuro che tu li stia passando, ci sono due alternative: o vengono passati con nomi errati (e non sembra) oppure non viene indicato correttamente al server dove trovarli.

    Io proverei ad aggiungere questa istruzione al tuo codice, assieme agli altri parametri che stai inviando: [CODE] xmlHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" Questo dovrebbe dare una informazione in più al server su come reperire i parametri della POST, esplicitandone il formato (magari il server non ne ha uno predefinito, oppure si basa per default su un JSON nel corpo della richiesta o qualcosa di simile).

    Se non funziona, puoi tentare appunto la strada del JSON...

    Ciao!
Devi accedere o registrarti per scrivere nel forum
9 risposte