[SOLVED] Puedo enviar no mas de 2 variables en una solicitud POST


#1

Hola Ubidots
He estado buscando alguna solucion en el foro por este tema y no puedo dar con la misma

El problema es que cuando envio 2 variables de la forma:

sprintf(buff, “POST /api/v1.6/collections/values HTTP/1.1\r\nContent-Type:application/json\r\nX-Auth-Token:%s\r\nHost:things.ubidots.com\r\nConnection: close\r\nContent-Length:%d\r\n\r\n[{“variable”:”%s",“value”:%s},{“variable”:"%s",“value”:%s}]\r\n\r\n",token,sizet,idVariable3,tension,idVariable2,corr);

lo hace correctamente

y cuando intento enviar una mas no lo hace. he intentado asignar un buff de mas espacio y ni asi lo puede recibir. No parece ser un problema de ubidots ya que al enviar las 3 variables por un terminal de cliente TCP/IP como Hercules la solicitud es atendida correctamente.

estoy usando un modulo wifi MRF24WB0MA.


#2

Hola, mirando la pieza de código que compartiste, deberías asegurarte que la variable sizet, que es la que almacena el tamaño de tu payload como valor para Content-Length sea calculada correctamente, en tu código el payload se construye solo al final y probablemente tengas un error en ese cálculo.

Te recomiendo ver ejemplos en nuestra documentación de hardware para que te hagas una idea sobre cómo construir correctamente tus peticiones HTTP.

Saludos.


#3

Jose gracias por la respuesta. lo pude solucionar por el momento partiendo el payload y enviandolo en 2 solicitudes ya que al parece el problema esta en la variable buff es demasiado larga para transmitirla de una sola vez.

                    char buff[400];
                    uitoa(ADC1BUF0,temp); //temperatura
                    size=strlen(temp)+10;
                    uitoa(ADC1BUF7,corr);  //corriente
                    size2=strlen(corr);
                    uitoa(ADC1BUF6,tension); //tension
                    size3=strlen(tension);
                    sizeid1=strlen(idVariable);
                    sizeid2=strlen(idVariable2);
                    sizeid3=strlen(idVariable3);
                    sizet=size3+size2+sizeid3+sizeid2+51;
                    //sizet=size+size2+size3+sizeid1+sizeid2+sizeid3+76;
                    //uitoa(sizet,sizen);
		
                     // Place the application protocol data into the transmit buffer.  For this example, we are 
                    connected to an HTTP server, so we'll send an HTTP POST request.
                    if(flag==1)
                    {
                    flag=0;
                    sprintf(buff, "POST /api/v1.6/collections/values HTTP/1.1\r\nContent-Type:application/json\r\nX- 
                    Auth-Token:%s\r\nHost:things.ubidots.com\r\nContent- 
                    Length:%d\r\n\r\n[{\"variable\":\"%s\",\"value\":%s}, 
                    {\"variable\":\"%s\",\"value\":%s}]\r\n\r\n",token,sizet,idVariable3,tension,idVariable2,corr);
                    
                    TCPPutArray(MySocket,buff,strlen(buff));
                    TCPFlush(MySocket);
                    }
                    else if(flag!=1)
                    {
                    flag=1;
                    sprintf(buff, "POST /api/v1.6/variables/%s/values HTTP/1.1\r\nContent-Type: application/json\r\nX-Auth-Token:%s\r\nHost:things.ubidots.com\r\nConnection: close\r\nContent-Length:%d\r\n\r\n{\"value\":%s}\r\n\r\n",idVariable,token,size,temp);
                    }
                    TCPPutArray(MySocket,buff,strlen(buff));
                    TCPFlush(MySocket);
                    GenericTCPExampleState++;
                    break;