我曾在C#中使用POST和GET,但尝试在C中实现它对我来说有点混乱。
我已使用本地计算机上的8443端口成功连接到套接字。
现在我正在尝试向127.0.0.1:8443/xxxx/xxxAPI
网址发送一个包含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");*/
答案 0 :(得分:4)
我建议使用类似libcurl
的库答案 1 :(得分:1)
尝试更像这样的事情:
int sendStr(int iSock, const char *szStr)
{
int ret;
int len = strlen(szStr);
while (len > 0) {
ret = send(iSock, szStr, len, 0);
if (ret == -1) {
//LogToFile("Error while request being sent to the server");
return -1;
}
szStr += ret;
len -= ret;
}
return 0;
}
char szContentHeader[32];
sprintf(szContentHeader, "Content-Length: %d\r\n", strlen(parameters));
sendStr(iSock, "POST /xxxx/xxxxxxAPI HTTP/1.1\r\n");
sendStr(iSock, "Host: hostname:8443\r\n");
sendStr(iSock, "User-Agent: Mozilla/4.0\r\n");
sendStr(iSock, "Accept: */*\r\n");
sendStr(iSock, "Accept-Language: en-us\r\n");
sendStr(iSock, "Accept-Encoding: gzip, deflate\r\n");
sendStr(iSock, szContentHeader);
sendStr(iSock, "Content-Type: application/x-www-form-urlencoded\r\n");
sendStr(iSock, "\r\n");
sendStr(iSock, parameters);
然后您可以阅读服务器的响应。根据如何发送响应,这本身就可以完全参与(并且超出了本问题的范围)。有关详细信息,请参阅RFC 2616 Section 4.4 Message Length,有关您需要实现的伪代码类型,请参阅我对以下问题的回答: