WiFiNina richieste HTML POST / PUT

Ciao a tutti,
vorrei upgradare un mio progetto per poter salvare i dati in cloud invece che su sd.
Ho acquistato un nano 33 iot ma sto avendo non poche difficoltà a trasferire i dati.
Ho letto mille mila tutorial e topics ma non ne vengo a capo.
Ho scelto PANTRY CLOUD perché gratuito e, in teoria, molto semplice.

Riesco a fare correttamente la richiesta di GET, ma non quelle di POST o PUT.
Se nel codice uso POST mi cancella tutti i dati, se uso PUT mi ritorna il contenuto come il GET senza aggiornare i dati.

QUI gli esempi di pantry cloud.

if (client.connect(server, 443)) {
    Serial.println("connected to server");
    // Make a HTTP request:
    //client.println("GET /apiv1/pantry/MYID/basket/MYBASKET HTTP/1.1");
    //client.println("Host: getpantry.cloud");
    client.println("PUT /apiv1/pantry/MYID/basket/MYBASKET/ HTTP/1.1");
    client.println("Host: getpantry.cloud");
    client.println("{\"stato\":\"1\"}");
    client.println("Connection: close");
    client.println();
  }

Questa la risposta del server dopo richiesta POST (che cancella tutti i dati):

Starting connection to server...
connected to server
HTTP/1.1 200 OK
Date: Sun, 09 Jul 2023 05:15:47 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
X-Frame-Options: SAMEORIGIN
X-Frame-Options: SAMEORIGIN
Access-Control-Allow-Origin: *
X-DNS-Prefetch-Control: off
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Mod-Pagespeed: 1.13.35.2-0
Cache-Control: max-age=0, no-cache
CF-Cache-Status: DYNAMIC
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=sKnQiOvQDb74p8sBXRRPwnWG%2B3D7mEmXkg0NRnZO6vGAEvh2kXFnTmJdxV%2FuNxR6m9t6CSD7aiAAzE2tq%2FzBOR2RmbiV%2FlFtH9QN8wJqrnAleLrtuuhSsaD4revs5TizP9s%3D"}],"group":"cf-nel","max_age":604800}
NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Server: cloudflare
CF-RAY: 7e3e1750ba697447-LHR
alt-svc: h3=":443"; ma=86400

30
Your Pantry was updated with basket: dipendenti!
0


disconnecting from server.

UPDATE: ho aggiornato il firmware di WiFiNina e adesso non funziona più nemmeno il GET....

Tutto qui quello che mandi al server?
I metodi PUT e POST prevedono un payload che nel tuo codice non vedo, stai inviando solo degli header.

Nel link che hai messo seleziona come lingua di programmazione HTTP - HTTP.
Il risultato che ottieni è ciò che devi inviare usando i metodi client.print() e client.println()

Nel dettaglio se c'è una richiesta che prevede un payload come POST e PUT, vanno sempre inseriti gli header
Content-Type: <il tipo del tuo contenuto>
Content-Length: <lunghezza in byte del tuo contenuto>

Siccome gli header vanno inviati prima del payload (separati da un client.println(); vuoto), devi prima "costruire" il payload usando una variabile opportuna per salvare il tuo JSON e poi calcolarne la lunghezza in modo da poterla inserire correttamente nell'header "Content-Length"

Hai aggiunto il certificato SSL del serve?

Il GET funzionava anche senza gli header, ho provato ad aggiungerli ma non si connette più al server.

L'esempio presente nella libreria wifinina dopo l'aggiornamento del firmware non funziona più e non si connette nemmeno lui al server (google).

Il certificato SSL non riesco ad aggiornarlo in nessun modo, nemmeno quello "standard" di arduino, ottengo sempre "Upload failed. Please try again".

Non è che hai il serial monitor attivo?
La procedura di caricamento dei certificati dell'IDE non va a buon fine se c'è il serial monitor aperto.

Senza certificati è normale che la connessione alla porta 443 di qualsiasi server non funzioni.

Le richieeste GET sono tipicamente più semplici da gestire, ma almeno l'header "Host" di solito è necessario (ma sono impostazioni che dipendono dal server)

Si avevo il serial monitor aperto :person_facepalming:

Ho aggiornato il codice, ora funziona di nuovo il GET ma non riesco a fare né POST né PUT.
Il POST mi cancella tutti i dati mentre il PUT come output sembra un GET...

String myPath = "/apiv1/pantry/MYID/basket/MyBasket";
  String commandGET = "GET " + myPath + " HTTP/1.1";
  String commandPOST = "POST" + myPath + " HTTP/1.1";
  String data = "{\"id\":\"1\"}";
  int dataLength = data.length();

  Serial.println("\nStarting connection to server...");
  if (client.connect(server, 443)) {
    Serial.println("connected to server");
    // Make a HTTP request:
    client.println(commandPOST);
    client.println("Host: getpantry.cloud");
    client.println("Content-Type: application/json");
    client.println("Content-Length: " + dataLength);
    client.println(data);
    client.println("Connection: close");
    client.println();
  }

Output del PUT:

Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=avXhnPGElFpWGlKyZralkIIP%2BS81Pc6IQdB7jsXflsDm1yo1hUbn0IGdLZ9t3f33dq8JGWK51Sctd6wsFlgM0OGa8W%2FyIpsWbJyGr5tKyvYq7JUDG25jwhSfXvyaAvNDPnQ%3D"}],"group":"cf-nel","max_age":604800}
NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Server: cloudflare
CF-RAY: 7e3ec01dea5b0e7b-MXP
alt-svc: h3=":443"; ma=86400

{"id":"33fc"}
disconnecting from server.

Output del POST:

NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Server: cloudflare
CF-RAY: 7e3ec6407d38baa3-MXP
alt-svc: h3=":443"; ma=86400

30
Your Pantry was updated with basket: dipendenti!
0


disconnecting from server.

Questo va alla fine dopo client.println();

Ho provato ma ottengo lo stesso risultato.
POST cancella tutto, PUT non aggiorna il valore. :pensive:

Credo di aver risolto, dopo innumerevoli bestemmie :rofl:

Ho aggiornato il codice così e adesso riesco a fare PUT e POST :partying_face:

client.print("Content-Length: ");
client.println(data.length());

Io evito sempre di concatenare le String in questo modo per questioni legate all'allocazione di memoria dinamica (vengono create diverse variabili temporanee che si possono evitare facendo variabile+="stringa da concatenare"),
ma non pensavo che potesse determinare questo tipo di malfunzionante... :scream:

Onestamente non so neanche perché mi sia venuto in mente di fare questa prova :sweat_smile:

Grazie per il supporto! :hugs:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.