GPRS_C_SDK icon indicating copy to clipboard operation
GPRS_C_SDK copied to clipboard

Http Post with json body

Open JazminFerre opened this issue 3 years ago • 0 comments

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

JazminFerre avatar Oct 29 '21 17:10 JazminFerre