Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的HTTPS Post请求_C_Sockets_Post_Https_Iot - Fatal编程技术网

C语言中的HTTPS Post请求

C语言中的HTTPS Post请求,c,sockets,post,https,iot,C,Sockets,Post,Https,Iot,我正在使用HTTPS POST请求从IoT设备向服务器发送数据,我想知道是否有更好的方法发送有效负载。我们正在以JSON格式发送大量数据,如电压、电荷状态、电流等。。我相信我所做的是低效的 这是我的帖子标题: char send_buf[] = "POST /api? HTTP/1.1\r\nHost: my-server.com\r\nConnection: keep-alive\r\nContent-type: application/json\r\nContent-length:

我正在使用HTTPS POST请求从IoT设备向服务器发送数据,我想知道是否有更好的方法发送有效负载。我们正在以JSON格式发送大量数据,如电压、电荷状态、电流等。。我相信我所做的是低效的

这是我的帖子标题:

char send_buf[] = "POST /api? HTTP/1.1\r\nHost: my-server.com\r\nConnection: keep-alive\r\nContent-type: application/json\r\nContent-length: 15\r\n\r\n{\"key\": \"value\"}";
我看到过使用snprintf构建字符串的示例,例如:

#define POST_TEMPLATE "POST %s? HTTP/1.1\r\n"\
        "Host: %s\r\n"\
        "Connection: keep-alive\r\n"\
        "Content-type: application/json\r\n"\
        "Content-length: %d\r\n\r\n"\
        "%s

    int send_data_len_post = snprintf(send_buf,
                         500, /*total length should not exceed MTU size*/
                         POST_TEMPLATE, HTTP_PATH,
                         HTTP_HOST, strlen(PostString),
                         PostString);
其中PostString是我试图访问的Web服务器,但我无法使其正常工作


需要注意的是,我创建和发送套接字以及从服务器发出简单GET请求的逻辑工作正常,但我在处理更复杂的post请求时遇到了问题。任何想法和帮助都会很好,谢谢

TCP是一个字节流。对
send()
的一次调用不太可能在一次操作中发送整个HTTP请求(请注意返回值!),因此如果需要,您必须准备多次调用
send()
。因此,您也可以将逻辑分解为
send()
不同的数据段,而无需将它们预先格式化为单个内存缓冲区,例如:

int send_all(int sckt、const void*buffer、int bufsize)
{
常量字符*ptr=(常量字符*)缓冲区;
而(bufsize>0)
{
int sent=send(sckt,ptr,bufsize,0);
如果(发送<0)
返回-1;
ptr+=已发送;
bufsize-=已发送;
}
返回0;
}
int send_str(int sckt,const char*str)
{
返回send_all(sckt、str、strlen(str));
}
int send_str_v(int sckt,…)
{
va_列表参数;
va_启动(args、sckt);
char*str;
while((str=va_arg(args,char*))!=NULL){
如果(发送_str(sckt,str)<0){
va_端(args);
返回-1;
}
}
va_端(args);
返回0;
}
...
char-clen[16]={0};
snprintf(clen,16,“%d”,strlen(PostString));
发送(sckt,“POST”,HTTP路径,“HTTP/1.1\r\n”,空);
发送(sckt,“主机:”,HTTP\U主机,“\r\n”,空);
send_str(sckt,“连接:保持活动\r\n”);
send_str(sckt,“内容类型:application/json\r\n”);
send_str_v(sckt,“内容长度:”,clen,“\r\n”,NULL);
发送(sckt,“\r\n”);
send_str(sckt,PostString);

在内部,TCP套接字将根据需要在网络层缓冲和分割数据,因此在应用层不要太担心它。

在您的示例中,内容长度应为16。我看不出这里有什么不对劲。如果json负载很小,那么与HTTP头相比,它是微不足道的。另一方面,如果有效负载包含更多内容,那么一些二进制数据可以节省大量的格式化/解析。您可以转储收到的查询吗?也许您的服务器需要一个
Accept
头。例如,我建议使用curl进行工作查询,然后将生成的查询与工作curl查询进行比较“但我无法使其工作…遇到问题…”-这不是一个有用的问题描述。请描述你尝试了什么,你的期望是什么,以及发生了什么。无法让这项工作在坏的要求。虽然我特别问是否有更好的方式发送POST请求。@Steffe感谢您的回复。我将发送23个数据点,因此我将研究您的建议@程序跳频