You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用CURL向PHP发送POST请求获取返回值异常问题咨询

问题排查与修复方案

问题1:PHP端返回逻辑错误

你当前的PHP代码无论请求是GET还是POST,都会完整输出整个HTML页面结构,POST请求的响应内容仅嵌入在HTML body底部,这就是你拿到完整HTML的核心原因。
修复方案:判断为POST请求时,输出结果后直接终止程序,不再输出后续HTML内容:

<?php
if($_SERVER["REQUEST_METHOD"]=="POST")
{
    $name = $_POST['name'];
    if(empty($name))
        echo "Name is empty";
    else
        echo $name;
    exit; // 新增这行,直接结束程序,不返回后面的HTML内容
}
?>
<html>
<head><title>Test Page</title></head>
<body>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
        <p>Name:</p><input type="text" name="name">
        <input type="submit">
    </form>
</body>

调整后浏览器访问还是正常的表单页面,CURL POST请求只会拿到你需要的纯文本响应。

问题2:C++端代码存在多处错误

  • 你注释了CURLOPT_WRITEFUNCTION和CURLOPT_WRITEDATA的配置,导致响应内容直接输出到控制台,没有存入指定的字符串变量
  • 变量名错误:判断请求结果时用的res未定义,你实际定义的变量是curl_res
  • 请求URL缺少http://前缀,低版本libcurl会识别失败
  • 存在内存泄漏:new string("")没有对应delete,实际可以直接用栈上的string变量避免内存问题

修复后的C++代码:

#include <iostream>
#include <curl/curl.h>
#include <string.h>

using namespace std;

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{  
     ((string*)userp)->append((char*)contents, size * nmemb);
     return size * nmemb;
}

int main()
{
     CURL *curl;
     CURLcode curl_res;
     string rBuffer; // 直接用栈上的字符串,不需要动态申请

     curl_global_init(CURL_GLOBAL_ALL);

     curl = curl_easy_init();
     if(curl)
     {
         curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.106/testwebserver/index.php"); // 补全http前缀
         curl_easy_setopt(curl, CURLOPT_POST, 1);
         curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=test");
         curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); // 取消注释
         curl_easy_setopt(curl, CURLOPT_WRITEDATA, &rBuffer); // 取消注释,传入栈上字符串的地址
         curl_res = curl_easy_perform(curl);
         if (curl_res != CURLE_OK) // 修正变量名
             fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(curl_res));
         else
             cout << "POST响应结果:" << rBuffer << endl; // 打印拿到的结果
         curl_easy_cleanup(curl);
    }
    curl_global_cleanup(); // 新增全局清理
    return 0;
 }

内容的提问来源于stack exchange,提问作者Blu Stack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:54:06