【发布时间】:2016-08-03 09:20:58
【问题描述】:
我曾在 C# 中使用过 POST 和 GET,但尝试在 C 中实现它让我有点困惑。
我已使用本地计算机上的 8443 端口成功连接到套接字。
现在我正在尝试向127.0.0.1:8443/xxxx/xxxAPI URL 发送一个带有 3 个参数的 POST 请求。
通常在 GET 中,我可以在我的 URL 本身中附加查询字符串……但在 POST 中,我需要消息正文、contentHeader、Type 等,然后是我的参数。
我在 C 语言中有一个自定义 TCP 代码,可以帮助我连接到服务器。成功连接后,我正在尝试执行以下伪代码之类的操作....但显然我不知道自己在做什么...有人可以指导我吗?
sprintf(szBuff, "POST /xxxx/xxxxxxAPI HTTP/1.1\r\n");
sprintf(contentHeader, "Content-Length: %d\r\n", 20);
send(iSock, szBuff, strlen(szBuff), 0);
send(iSock, "Accept: */*\r\n", 15, 0);
send(iSock, "User-Agent: Mozilla/4.0\r\n", 27, 0);
send(iSock, contentHeader, strlen(contentHeader), 0);
send(iSock, "Accept-Language: en-us\r\n", 26, 0);
send(iSock, "Accept-Encoding: gzip, deflate\r\n", 34, 0);
send(iSock, "Host: ", 6, 0);
send(iSock, "hostname", 8, 0);
send(iSock, "\r\n", 4, 0);
send(iSock, "Content-Type: application/x-www-form-urlencoded\r\n", 50, 0);
send(iSock, "\r\n", 4, 0);
send(iSock, "\r\n", 4, 0);
send(iSock, parameters, strlen(parameters), 0);
send(iSock, "\r\n", 4, 0);
/*if (write(iSock, szBuff, sizeof(szBuff)) == -1)
LogToFile("Error while request being sent to the server");*/
【问题讨论】:
-
'do{...} while(0); ' ???
-
对不起,这是错误检查的一部分,我没有在代码中显示...我将其删除以避免混淆
-
那些硬编码的长度是个坏主意。其中一些是错误的。
"\r\n"是一个由 2 个字符组成的字符串,而不是 4 个字符。此外,您在 Content-Type 之后发送了 3 个连续的\r\n对,1 个太多了。你确定不只是想使用fdopen? -
不要自己实现http。这是一个巨大的协议。使用已有的 C 库
-
如果您为此设置使用“C”,我会说您的第一个发送 (
send(iSock, szBuff, strlen(szBuff), 0);) 是要遵循的模型,创建一个要发送的字符串,然后使用 @ 发送它987654327@ 因为(相信我)另一种方法将在未来的某一天(惊人地)失败。