C编程 - 带参数的Http POST请求

时间:2016-04-12 16:12:57

标签: c sockets http-post

我曾在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");*/

2 个答案:

答案 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,有关您需要实现的伪代码类型,请参阅我对以下问题的回答:

When is an HTTP response finished?