【问题标题】:C programming - Http POST Request with parametersC 编程 - 带参数的 Http POST 请求
【发布时间】: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@ 因为(相信我)另一种方法将在未来的某一天(惊人地)失败。

标签: c sockets http-post


【解决方案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?

【讨论】:

    【解决方案2】:

    我建议使用 libcurl 之类的库

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2016-05-14
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多