php is_post,PHP发送get、post请求的6种方法简明总结

方法1: 用file_get_contents 以get方式获取内容:

$url='http://www.jb51.net/';

$html = file\_get\_contents($url);

echo $html;

?>

方法2: 用fopen打开url, 以get方式获取内容:

$fp = fopen($url, ‘r');

stream\_get\_meta_data($fp);

while(!feof($fp)) {

$result .= fgets($fp, 1024);

}

echo “url body: $result”;

fclose($fp);

?>

方法3:用file_get_contents函数,以post方式获取url

$data = array (‘foo' => ‘bar');

$data = http\_build\_query($data);

$opts = array (

‘http' => array (

‘method' => ‘POST',

‘header'=> “Content-type: application/x-www-form-urlencodedrn” .

“Content-Length: ” . strlen($data) . “rn”,

‘content' => $data

)

);

$context = stream\_context\_create($opts);

$html = file\_get\_contents(‘http://localhost/e/admin/test.html', false, $context);

echo $html;

?>

方法4:用fsockopen函数打开url,以get方式获取完整的数据,包括header和body,fsockopen需要 PHP.ini 中 allow_url_fopen 选项开启

function get_url ($url,$cookie=false)

{

$url = parse_url($url);

$query = $url\[path\].”?”.$url\[query\];

echo “Query:”.$query;

$fp = fsockopen( $url\[host\], $url\[port\]?$url\[port\]:80 , $errno, $errstr, 30);

if (!$fp) {

return false;

} else {

$request = “GET $query HTTP/1.1rn”;

$request .= “Host: $url\[host\]rn”;

$request .= “Connection: Closern”;

if($cookie) $request.=”Cookie: $cookien”;

$request.=”rn”;

fwrite($fp,$request);

while(!@feof($fp)) {

$result .= @fgets($fp, 1024);

}

fclose($fp);

return $result;

}

}

//获取url的html部分,去掉header

function GetUrlHTML($url,$cookie=false)

{

$rowdata = get_url($url,$cookie);

if($rowdata)

{

$body= stristr($rowdata,”rnrn”);

$body=substr($body,4,strlen($body));

return $body;

}

return false;

}

?>

方法5:用fsockopen函数打开url,以POST方式获取完整的数据,包括header和body

function HTTP_Post($URL,$data,$cookie, $referrer=”")

{

// parsing the given URL

$URL\_Info=parse\_url($URL);

// Building referrer

if($referrer==”") // if not given use this script as referrer

$referrer=”111″;

// making string from $data

foreach($data as $key=>$value)

$values\[\]=”$key=”.urlencode($value);

$data_string=implode(“&”,$values);

// Find out which port is needed – if not given use standard (=80)

if(!isset($URL_Info\["port"\]))

$URL_Info\["port"\]=80;

// building POST-request:

$request.=”POST “.$URL_Info\["path"\].” HTTP/1.1n”;

$request.=”Host: “.$URL_Info\["host"\].”n”;

$request.=”Referer: $referern”;

$request.=”Content-type: application/x-www-form-urlencodedn”;

$request.=”Content-length: “.strlen($data_string).”n”;

$request.=”Connection: closen”;

$request.=”Cookie: $cookien”;

$request.=”n”;

$request.=$data_string.”n”;

$fp = fsockopen($URL\_Info\["host"\],$URL\_Info\["port"\]);

fputs($fp, $request);

while(!feof($fp)) {

$result .= fgets($fp, 1024);

}

fclose($fp);

return $result;

}

?>

方法6:使用curl库,使用curl库之前,可能需要查看一下php.ini是否已经打开了curl扩展

$ch = curl_init();

$timeout = 5;

curl\_setopt ($ch, CURLOPT\_URL, ‘http://www.jb51.net/');

curl\_setopt ($ch, CURLOPT\_RETURNTRANSFER, 1);

curl\_setopt ($ch, CURLOPT\_CONNECTTIMEOUT, $timeout);

$file\_contents = curl\_exec($ch);

curl_close($ch);

echo $file_contents;

?>

<think>嗯,用户想了解如何在C++中发送POST请求。这个问题看起来是关于网络编程的。首先,我得确定用户的基础,可能对C++有一定了解,但不太熟悉网络相关的库。 C++标准库没有直接支持HTTP请求的功能,所以需要借助第三方库。常见的库有libcurl、cpp-httplib,或者Boost.Beast。我得先列出这些选项,然后分别说明它们的用法。 用户可能需要一个简单的方法,所以应该推荐容易使用的库,比如cpp-httplib,因为它头文件-only,配置简单。然后是libcurl,虽然功能强大,但需要安装和链接。Boost.Beast属于Boost,适合已经有Boost环境的项目。 接下来要分步骤讲解,比如安装库、包含头文件、编写代码示例。每个库的例子都要简明,展示发送POST请求的核心代码。比如使用cpp-httplib的话,代码比较简洁,而libcurl需要更多设置。 还要注意跨平台的问题,比如Windows可能需要额外的配置,比如链接libcurl的库文件,或者使用vcpkg安装。可能需要提醒用户注意编译时的链接选项。 另外,可能需要解释POST请求的基本结构,比如设置URL、请求头、表单数据或JSON数据。不同的库有不同的设置方式,需要分别说明。 可能用户会遇到常见问题,比如SSL证书的问题,或者如何处理响应数据。需要简要提到这些点,但不需要深入,除非用户进一步提问。 最后,总结一下各个库的优缺点,帮助用户根据项目需求选择。比如,如果项目小,快速开发,推荐cpp-httplib;如果需要更底层控制,用libcurl或Boost.Beast。 要确保代码示例正确,语法无误,特别是转义字符和字符串处理。例如,POST数据中的引号需要正确处理,避免编译错误。 可能还需要提到异常处理和错误检查,比如检查HTTP响应状态码,处理网络连接失败的情况。但用户的问题可能只需要基础示例,所以可以简要提及,让用户知道需要注意这些方面。 总之,回答需要结构清晰,分步骤,提供多个选项,并给出具体示例,同时指出可能遇到的问题和解决方案。确保用户能根据指导快速实现POST请求的功能。</think>在 C++ 中发送 POST 请求需要通过第三方网络库实现,以下是三种常见方案的详细步骤和示例代码: 一、基础方案:使用 cpp-httplib(推荐新手) 1. 安装:单头文件库,直接从 GitHub 下载 `httplib.h` 2. 代码示例: ```cpp #include <httplib.h> int main() { httplib::Client cli("http://httpbin.org"); // 设置表单数据 httplib::Params params; params.emplace("key1", "value1"); params.emplace("key2", "value2"); // 发送POST请求 auto res = cli.Post("/post", params); if (res && res->status == 200) { std::cout << "响应内容:" << res->body << std::endl; } return 0; } ``` 二、进阶方案:使用 libcurl(跨平台/企业级) 1. 安装:Linux 使用 `sudo apt-get install libcurl4-openssl-dev` Windows 通过 vcpkg 安装 2. 代码示例: ```cpp #include <curl/curl.h> static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* s) { s->append((char*)contents, size * nmemb); return size * nmemb; } int main() { CURL* curl = curl_easy_init(); std::string response; if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/post"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "key1=value1&key2=value2"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); CURLcode res = curl_easy_perform(curl); if(res != CURLE_OK) { std::cerr << "请求失败:" << curl_easy_strerror(res) << std::endl; } curl_easy_cleanup(curl); std::cout << "响应内容:" << response << std::endl; } return 0; } ``` 三、企业级方案:Boost.Beast(需要 C++11 或更高) ```cpp #include <boost/beast/core.hpp> #include <boost/beast/http.hpp> #include <boost/asio.hpp> namespace beast = boost::beast; namespace http = beast::http; using tcp = boost::asio::ip::tcp; int main() { boost::asio::io_context ioc; tcp::resolver resolver(ioc); beast::tcp_stream stream(ioc); // 解析域名 auto const results = resolver.resolve("httpbin.org", "80"); stream.connect(results); // 构造请求 http::request<http::string_body> req{http::verb::post, "/post", 11}; req.set(http::field::host, "httpbin.org"); req.set(http::field::content_type, "application/x-www-form-urlencoded"); req.body() = "key1=value1&key2=value2"; req.prepare_payload(); // 发送请求 http::write(stream, req); // 接收响应 beast::flat_buffer buffer; http::response<http::dynamic_body> res; http::read(stream, buffer, res); std::cout << "响应状态码:" << res.result_int() << std::endl; std::cout << "响应内容:" << boost::beast::buffers_to_string(res.body().data()) << std::endl; return 0; } ``` 四、选择建议: 1. 快速开发:优先选择 cpp-httplib 2. 企业级应用:推荐 libcurl(功能最全)或 Boost.Beast(现代 C++ 风格) 3. HTTPS 支持:libcurl 和 cpp-httplib 需配置 SSL 证书路径 五、常见问题处理: 1. 中文编码:发送前进行 URL 编码 2. 超时设置:libcurl 使用 `CURLOPT_TIMEOUT` 3. JSON 格式:设置 `Content-Type: application/json` 并构造 JSON 字符串 编译注意事项: - libcurl 需链接库:`-lcurl` - Boost 需链接 `system` 和 `beast` 库 - Windows 建议使用 vcpkg 管理依赖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值