Vai al contenuto

Inviare dati JSON in GET o POST ad un servizio REST

Home Forum Controllori SlimLine e Netsyst (LogicLab) Inviare dati JSON in GET o POST ad un servizio REST

Stai visualizzando 9 post - dal 1 a 9 (di 9 totali)
  • Autore
    Post
  • #46513
    Andrea Feduzzi
    Partecipante

    Salve un cliente mi ha chiesto, per comunicare con il proprio gestionale, di inviare http con un json, il servizio è un API rest. Posso usare il FB RESTClient ?

    Qui sotto lascio due esempi dati dal cliente, in GET un esempio è questo::

    href="https://webhook-service.photoforse.online/webhooks/custom/6eb07212-b85c-4ca1-866f-0521e3af07b9?idAzienda=1&idOrdine=12345" target="_blank" rel="noopener">https://sample-service.esempio.online/webesempio/custom/6eb07212-b85c-4ca1-866f-0521e3af07b9?idAzienda=1&idOrdine=12345

    Oppure in POST dove invece abbiamo:

    https://sample.service.esempio.online/webesempio/custom/6eb07212-b85c-4ca1-866f-0521e3af07b9
    #46516
    Sergio Bertana
    Amministratore del forum

    Il FB RESTClient non è trasparente, il FB aggiunge ai dati delle ulteriori informazioni che sono utilizzate per controllare il dialogo con il server. In pratica viene aggiunto un identificativo di messaggio una versione di messaggio ed il numero di reinvio in caso di errore.

    Ma quello che ti serve lo puoi tranquillamente realizzare utilizzando il FB HTPClient che può gestire sia richieste GET che PUT e POST. Ma attenzione al momento non è gestito l’https, quindi se il server REST accetta anche richieste HTTP lo puoi sicuramente gestire. Ecco un esempio di richiesta GET:

    HTTPRq.Method:=0; (* Request method, GET *)
    HTTPRq.HostAddress:=ADR('webhook-service.photoforse.online'); (* Main coordinator *)
    HTTPRq.HostName:=HTTPRq.HostAddress; (* Hostname *)
    HTTPRq.HostPort:=80; (* Server port *)
    HTTPRq.Page:=ADR('webhooks/custom/6eb07212-b85c-4ca1-866f-0521e3af07b9'); (* Web page *)
    HTTPRq.Request:=ADR('idAzienda=1$26idOrdine=12345'); (* Request string *)
    HTTPRq.DBSize:=256; (* Data buffer size *)
    HTTPRq.Timeout:=10000; (* Execution timeout *)
    #46549
    giuseppe magistri
    Partecipante

    Stiamo testando un vostro PLC: MPS053B110 SW:SFW184B090, per verificarne la compatibilità con i nostri sistemi di supervisione.

    Sarebbe possibile avere un semplice demo di programma che ci consenta di leggere e scrivere anche solo un ingresso digitale ed un uscita digitale in con protocollo JSON in HTTP?

    #46559
    Sergio Bertana
    Amministratore del forum

    La domanda è un pò fuori topic, qui stiamo parlando di inviare e ricevere stringe JSON dal PLC che agisce come client (Agisce come un browser) verso un servizio REST che è un server HTTP.

    A te invece serve che il PLC agisca da server HTTP ed il tuo SCADA è un client, in questo caso puoi utilizzare la tecnica delle pagine dinamiche vedi questo topic.

    Anche se solitamente gli SCADA dialogano con i PLC con protocolli di comunicazione diversi, e noi a questo scopo gestiamo standard il protocollo Modbus.

    #58251
    [email protected]
    Partecipante

    Sto cercando di impostare l’FB RESTClient_v3 per inviare una richiesta, del tipo:

    http://192.168.101.240:8080/v2.0.0/status

    Usando il metodo GET, purtroppo dopo l’importazione della libreria compilando il programma ho il seguente errore:

    RESTClient_v3.FIFOFile – error A4108:  @FIFOFile_v1 => Base object not found

    da cosa dipende?

    #58254
    Sergio Bertana
    Amministratore del forum

    Da quello che dici credo tu abbia fatto un copia incolla dell’esempio riportato nel manuale, come vedi quell’esempio utilizza diversi blocchi funzioni:

    FIFOFile_v1;
    RESTClient_v3;
    HTTPClient_v2;
    JSONDecode_v2;
    JSONEncode_v1;

    Quindi una volta eseguito il copia incolla come indicato qui, devi anche importare nel tuo progetto tutti gli oggetti (Funzioni e blocchi funzione) richiesti dalle varie librerie, vedi capitolo Importazione oggetto in questa pagina.

    #58258
    [email protected]
    Partecipante

    In effetti non avevo importato l’FB FIFOFile_v1  che si trova nella libreria “eLLabLogLib.plclib”.

    #58314
    Sergio Bertana
    Amministratore del forum

    Vedo alcuni errori nella tua richiesta, il campo HostAddress deve essere definito solo con l’indirizzo IP o l’URL del server, quindi nel tuo caso ADR(‘192.168.101.240’). Il valore della porta 8080 lo hai già definito correttamente nel campo HostPort.

    Il campo HostName identifica il nome host nel caso di servizi multihosting, nel tuo caso è corretto settarlo uguale a HostAddress.

    Non hai definito il campo Page che identifica la pagina (O meglio lo script) a cui inviare i dati. Nel tuo caso mi sembra tu abbia scritto delle regole di rewrite in htaccess sul tuo sito, quindi in Page potresti scrivere  “v2.0.0/status”.

    Meglio sarebbe avere uno script che accetti i parametri in GET o POST ed avere un parametro che identifica la richiesta (Esempio Job=GetStatus) in questo modo con lo stesso script puoi gestire più comandi. In questo caso la richiesta andrebbe definita nel parametro Header.

    Quello che visualizzi in Watch purtroppo è un BUG di LogicLab che non visualizza il valore stinga di una variabile pointer. Ma un GRANDISSIMO aiuto al debug lo puoi avere dallo spionaggio.

    #58315
    Sergio Bertana
    Amministratore del forum

    Aggiungo su un post separato perchè merita un approfondimendo la gestione della autenticazione, ho visto che hai definito l’Header che non hai terminato con <CR><LF>

    HTTP.Header:=ADR('Authorization: Bearer GlzdHJpYnV0b3I6MmU1Y2JiMmQzMjZhNGMyNGRjYzgxN2UxNGFkZDI2OTliYTJmOGZkMDg4YTBlYzlmYjJlYzlkZmE5YWY4ZGJiOA==');

    E scrivi che hai definito valore convertito in base64 per Utente e Password, ma Authorization: Bearer si utilizza per autorizzazione con token, per l’autenticazione con utente e password si utilizza Authorization: Basic che deve essere calcolata in Base64 definendo username e password separate da “:”.

    Quindi ad esempio l’utente Root con password MyPassword codificando con un codificatore on-line la stringa Root:MyPassword, avremo:

    HTTPRq.Header:=ADR('Authorization: Basic Um9vdDpNeVBhc3N3b3Jk$r$n');

    Come vedi termino la stringa con il <CR><LF>.

     

Stai visualizzando 9 post - dal 1 a 9 (di 9 totali)
  • Devi essere connesso per rispondere a questo topic.