使用libcurl进行POST请求

时间:2014-09-30 18:32:33

标签: c++ c post libcurl

我之前说过我还是一名新的C / C ++程序员,所以请原谅我可能是一个多余的问题。

我用C / C ++编写程序来与本网站进行交互:http://www.youtube-mp3.org/

根据我的理解,要让我的程序为我下载链接,我必须向包含我要转换的URL的服务器发送POST请求,然后找到一种方法让它跟随生成的URL允许我下载文件。我也明白libcurl是用C / C ++做这种事情的好方法。

我已尝试在libcurl网站(http://curl.haxx.se/libcurl/c/simplepost.html和另一个网站上)使用POST示例,但似乎都不起作用。另外,我不知道如何让我的程序按照显示'下载' 的链接。我已经尝试发送POST请求,然后告诉我的程序获取页面的html源并将其存储在一个文件中,但该文件似乎不包含任何下载链接。当通过浏览器完成此操作时,页面源肯定包含一个可用的下载链接。

非常感谢一些帮助,因为我不确定我是否完全错误的想法!

编辑:我的问题根本不清楚。以下是我用于POST请求的相关代码:

static const char *postthis="http://www.youtube.com/watch?v=KMU0tzLwhbE";

CURL *curl;
CURLcode res;

curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.youtube-mp3.org/");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);

curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));

/* Perform the request, res will get the return code */ 
res = curl_easy_perform(curl);
/* Check for errors */ 
if(res != CURLE_OK)
  fprintf(stderr, "curl_easy_perform() failed: %s\n",
          curl_easy_strerror(res));
}

用于将html源写入文件:

   static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
   int written = fwrite(ptr, size, nmemb, (FILE *)stream);
   return written;
}


{

  static const char *filename = "head.txt";
  FILE *htmlfile;

  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

  // open the file
  htmlfile = fopen(filename,"w");
  if (htmlfile == NULL) {
    curl_easy_cleanup(curl);
    return -1;
   }

  curl_easy_setopt(curl,CURLOPT_WRITEDATA, htmlfile);

  curl_easy_perform(curl);

  /* close the header file */
  fclose(htmlfile);

  /* always clean up */
  curl_easy_cleanup(curl);

}

1 个答案:

答案 0 :(得分:0)

您的代码不起作用,因为您假设错误的逻辑开始。

http://www.youtube-mp3.org不使用POST,实际上它的下载表格根本不提交到服务器端网址。当您点击"转换视频"按钮,调用客户端JavaScript以处理输入URL,从YouTube下载相关信息,以及修改呼叫页面的HTML以显示实际下载链接和视频预览图像。这就是为什么当您只是检索HTML时没有看到下载链接的原因 - 您没有调用执行准备下载链接的实际工作的JavaScript。而且你无法从一个应用程序中做到这一点(没有很多额外的工作),它必须在一个Web浏览器中完成,它有一个真正的JavaScript引擎和一个真正的DOM供脚本操作。