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.
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"
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)
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();
}
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...