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
相关产品推荐
相关产品推荐

