Ho bisogno di inviare un'http request di tipo POST ad un server, ma fin'ora i miei tentativi non sono andati a buon fine. La probabile causa è, a mio avviso, il valore assegnato all'attributo Content-Lenght.
Il server infatti è raggiungibile, in quanto se sostituisco il metodo POST con il metodo GET (che non richiede il Content-Lenght), riesco a connettermi senza problemi al server. Questo è il codice che ho utilizzato per generare il pacchetto HTTP da inviare:
void setup() {
String body = HttpRequestBody("33", "77%");
client.println("POST /dataserver HTTP/1.1");
client.println("Accept: text/xml, multipart/related");
client.println("Content-Type: text/xml; charset=utf-8");
client.println("SOAPAction: \"http://example.com/Functions/SendDataRequest\"");
client.println("User-Agent: Arduino WiFiShield");
client.println("Content-Lenght: "+body.length());
client.println("Host: arduino-data-server.appspot.com");
client.println("Connection: Keep-Alive");
client.println();
client.println(body);
client.close();
}
String HttpRequestBody(String v1, String v2) {
Serial.println("Generating xml message...");
String res = "";
res += "<?xml version=\"1.0\"\n\r";
res +="<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\"\n\r";
res +="<S:Body>\n\r";
res +="<ns2:sendData xmlsn:ns2=\"http://example.com\">\n\r";
res +="<arg0>"+v1+"</arg0>\n\r";
res +="<arg1>"+v2+"</arg1>\n\r";
res +="</ns2:sendData>\n\r";
res +="</S:Body>\n\r";
res +="</S:Envelope>\n\r";
Serial.println(res);
return res;
Non era un problema di ram (ho un arduino DUE, e comunque quella stringa non occupa chissà quanto).
Per quanto riguarda la somma di puntatori, no, non sto facendo quello. Infatti ho utilizzato oggetti istanza della classe String e non puntatori ad array di char (come in C). in quel caso avresti avuto ragione.
Il problema alla fine l'ho risolto (dopo non poche imprecazioni in differenti lingue). Si trova nella parte di codice in cui assegno il valore all'attributo Content-Length. Infatti non so per quale motivo (se qualcuno me lo spiega ne sarei ben felice), scrivere tutto in un unico println genera un pacchetto http errato che viene scartato dal server che non riesce a capire quanto sarà lungo il body. La soluzione è quella di scrivere la coppia attributo-valore con due comandi distinti:
giozh:
Non era un problema di ram (ho un arduino DUE, e comunque quella stringa non occupa chissà quanto).
ah ok, la DUE ti salva. una UNOva già in palla con un array di 100byte, figurati RIALLOCANDO quell'array per concatenare altri byte cosa può succedere.
giozh:
Per quanto riguarda la somma di puntatori, no, non sto facendo quello. Infatti ho utilizzato oggetti istanza della classe String e non puntatori ad array di char (come in C). in quel caso avresti avuto ragione.
no, stu stai mischiando string e String, NON so chi vince, ma se vedi i dati arrivare giusti vince la Strinf e concatena giusto.
invece su client.println("Content-Lenght: "+body.length());
strai concatenando string e int, e quindi sommi al puntatore dell'array di char che contiene "Content-Lenght: "il valore body.length(), in pratica è come se avessi scritto: