GPRS_C_SDK
GPRS_C_SDK copied to clipboard
Http Post with json body
Hi, I am trying to send a json body in http POST with this funtion, the endpoint works but the body doesnt. Could somebody help me? The body has this format sprintf(body,"{"message":"Hola","from":"Jaz"}"); The funtion without the body works great. It is the one in the demo.
int Http_Post(const char* domain, int port,const char* path, char* body, int bodyLen, char* retBuffer, int* bufferLen) { bool flag = false; uint16_t recvLen = 0; uint8_t ip[16]; int retBufferLen = bufferLen; //connect server memset(ip,0,sizeof(ip)); if(DNS_GetHostByName2(domain,ip) != 0) { Trace(1,"get ip error"); return -1; } Trace(1,"get ip success:%s -> %s",domain,ip); char servInetAddr = ip; snprintf(retBuffer,retBufferLen,"POST %s HTTP/1.1\r\nContent-Type: application/json;charset=utf8\r\nConnection: Keep-Alive\r\nHost: %s\r\nAccept: application/json\r\nContent-Length: %d\r\n%s\r\n",path,domain,bodyLen,body); char* pData = retBuffer; int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(fd < 0){ Trace(1,"socket fail"); return -1; } Trace(1,"fd:%d",fd);
struct sockaddr_in sockaddr;
memset(&sockaddr,0,sizeof(sockaddr));
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(port);
inet_pton(AF_INET,servInetAddr,&sockaddr.sin_addr);
int ret = connect(fd, (struct sockaddr*)&sockaddr, sizeof(struct sockaddr_in));
if(ret < 0){
Trace(1,"socket connect fail");
return -1;
}
Trace(1,"socket connect success");
Trace(1,"send request:%s",pData);
ret = send(fd, pData, strlen(pData), 0);
if(ret < 0){
Trace(1,"socket send fail");
return -1;
}
Trace(1,"http %s y sizeof %d",body,bodyLen);
ret = send(fd, body, bodyLen, 0);
if(ret < 0){
Trace(2,"socket send fail");
return -1;
}
Trace(1,"socket send success");
struct fd_set fds;
struct timeval timeout={12,0};
FD_ZERO(&fds);
FD_SET(fd,&fds);
while(!flag)
{
ret = select(fd+1,&fds,NULL,NULL,&timeout);
switch(ret)
{
case -1:
Trace(1,"select error");
flag = true;
break;
case 0:
Trace(1,"select timeout");
flag = true;
break;
default:
if(FD_ISSET(fd,&fds))
{
Trace(1,"select return:%d",ret);
memset(retBuffer+recvLen,0,retBufferLen-recvLen);
ret = recv(fd,retBuffer+recvLen,retBufferLen-recvLen,0);
Trace(1,"ret:%d",ret);
recvLen += ret;
if(ret < 0)
{
Trace(1,"recv error");
flag = true;
break;
}
else if(ret == 0)
{
Trace(1,"ret == 0");
flag = true;
break;
}
else if(ret < 1352)
{
Trace(1,"recv len:%d,data:%s",recvLen,retBuffer);
*bufferLen = recvLen;
close(fd);
return recvLen;
}
}
break;
}
}
close(fd);
return -1;
}
thanksss