登录
首页 >  文章 >  php教程

PHP发送POST请求的简单示例代码如下:<?php$url='https://example.com/api/endpoint';$data=array('key1'=>'value1','key2'=>'value2');//将数据转换为JSON格式$dataString=json_encode($data);//初始化cURL会话$ch=curl_init();//设置cU

时间:2026-02-18 10:21:47 148浏览 收藏

本文深入解析了PHP中发送POST请求的最佳实践,重点推荐使用curl_init()作为最稳妥、兼容性最好且控制力最强的方式,并详细拆解了常见陷阱与解决方案:如何正确设置CURLOPT_POST、CURLOPT_POSTFIELDS、CURLOPT_RETURNTRANSFER和超时参数;如何安全发送JSON数据并手动配置Content-Type头;为何应避免file_get_contents()在生产环境使用;以及HTTPS证书验证、重定向处理和关键错误检查(如curl_exec返回值、curl_error)等不可忽视的运维细节——帮你避开90%的线上请求失败问题。

php代码示例如何发送post请求_php发送post请求代码示例【示例】

curl_init() 发送 POST 请求最稳妥

PHP 原生发 POST,curl_init() 是目前兼容性最好、控制力最强的方式,比 file_get_contents()stream_context_create() 更直观,也比废弃的 http_post_data() 可靠得多。

常见错误是没设 CURLOPT_RETURNTRANSFER,导致返回 bool(true) 而不是响应体;或者漏掉 CURLOPT_POSTCURLOPT_POSTFIELDS,请求变成 GET 或直接空发。

  • 必须显式设置 CURLOPT_POST => true
  • CURLOPT_POSTFIELDS 接收数组(自动编码为 application/x-www-form-urlencoded)或字符串(需手动设 Content-Type
  • 建议始终开启 CURLOPT_RETURNTRANSFERCURLOPT_HEADER(调试时设为 true,上线前关掉)
  • 超时务必设,比如 CURLOPT_TIMEOUT => 10,避免阻塞
$ch = curl_init('https://api.example.com/login');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['username' => 'admin', 'password' => '123']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

发送 JSON 数据要手动处理 Content-Type

如果目标接口要求 Content-Type: application/json(比如多数 REST API),不能直接传数组给 CURLOPT_POSTFIELDS,否则会发成表单格式,后端收不到 json_decode(file_get_contents('php://input')) 的数据。

必须把数组 json_encode() 成字符串,并显式设置请求头。

  • json_encode(['key' => 'val']) 构造请求体
  • 通过 CURLOPT_HTTPHEADER 加入 Content-Type: application/json
  • 注意检查 json_last_error(),避免空数组或非法字符导致编码失败
$data = json_encode(['email' => 'user@example.com', 'token' => 'abc123']);
$ch = curl_init('https://api.example.com/webhook');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

file_get_contents() 发 POST 很容易出错

虽然语法更短,但 stream_context_create() 对参数名和嵌套层级敏感,稍不注意就发不出数据,而且错误提示极不友好(常返回 false 且无日志)。

典型问题包括:http 数组写成顶层键而非子数组、content 没做 http_build_query()json_encode()、漏掉 method 设置。

  • method 必须大写,如 'POST'
  • content 必须是字符串,不能是数组
  • 若发 JSON,记得加 header 项并包含 Content-Type
  • 不推荐在生产环境用这种方式,调试困难,异常难捕获
$opts = [
    'http' => [
        'method' => 'POST',
        'header' => "Content-Type: application/json\r\n",
        'content' => json_encode(['id' => 123])
    ]
];
$result = file_get_contents('https://api.example.com/item', false, stream_context_create($opts));

别忽略 HTTPS 证书验证和重定向

本地开发时用 CURLOPT_SSL_VERIFYPEER => false 看似省事,但上线后会因证书校验失败而静默失败;同样,不处理重定向(CURLOPT_FOLLOWLOCATION)可能导致 302 后拿不到真实响应。

  • 线上环境必须保留 CURLOPT_SSL_VERIFYPEER => true(PHP 5.6+ 默认开启)
  • 如需跟随跳转,加上 CURLOPT_FOLLOWLOCATION => true,但注意某些 API 明确禁止重定向
  • curl_error($ch)curl_errno($ch) 检查底层错误,比如 CURLE_SSL_CACERT 表示证书路径不对
  • 自建 CA 或内网环境,可通过 CURLOPT_CAINFO 指定证书路径
实际项目里,curl_init() 的容错和可观测性远高于其他方式。最容易被忽略的是:没检查 curl_exec() 返回值是否为 false,以及没用 curl_error() 捕获连接层失败——这些不会抛异常,但会导致逻辑误判。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>