PHP cURL提交登录表单至API失败,请求排查问题
问题:PHP cURL POST登录凭证到Node.js接口失败,提示缺少邮箱和密码
我尝试用PHP cURL把HTML表单里的邮箱和密码POST到Node.js登录接口,成功后要跳转到admin/index.php,但一直收到接口返回的{"success":"false","message":"please provide email and password"}错误,自己对cURL不熟,找不到问题,帮忙排查。
我的PHP代码:
<?php session_start(); // include('includes/config.php'); $error = ''; //Variable to Store error message; if (isset($_POST['login'])) { if (empty($_POST['email']) || empty($_POST['password'])) { $error = "Email or Password is Invalid"; } else { //Define $user and $pass $email = ($_POST['email']); $password = ($_POST['password']); $url = 'http://localhost:5000/auth/login'; $curl = curl_init($url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_USERPWD, $email.":".$password); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(['email' => $email, 'password' =>$password])); $result = curl_exec($curl); echo $result; if ($result == 200) { $_SESSION['alogin'] = $email; header("Location: admin/index.php"); // Redirecting to other page } else { $error = "Try to login."; } curl_close($curl); } } ?>
HTML表单:
<div class="panel panel-info"> <div class="panel-heading"> LOGIN FORM </div> <div class="panel-body"> <form role="form" method="post" name="login" action="index.php" role="form"> <div class="form-group"> <label>Enter Email</label> <input class="form-control" type="email" name="email" autocomplete="off" /> </div> <div class="form-group"> <label>Password</label> <input class="form-control" type="password" name="password" autocomplete="off" /> </div> <button type="submit" name="login" class="btn btn-info">LOGIN</button> </form> </div> </div>
问题排查与修复
你的代码存在3个核心问题,导致接口无法正确识别参数:
- 未声明JSON请求格式:你用
json_encode()生成了JSON参数,但没有告诉接口请求体是JSON类型,Node.js接口默认会按表单格式解析,自然读不到JSON里的内容。 - 误用
CURLOPT_USERPWD:这个选项是用来设置HTTP基础认证的账号密码,不是POST提交的业务参数,属于多余配置。 - 错误判断请求结果:
curl_exec()返回的是接口的响应内容(比如你看到的JSON字符串),不是HTTP状态码,拿它和200比较永远不会成立。
修正后的PHP代码:
<?php session_start(); $error = ''; if (isset($_POST['login'])) { if (empty($_POST['email']) || empty($_POST['password'])) { $error = "邮箱或密码不能为空"; } else { $email = $_POST['email']; $password = $_POST['password']; $url = 'http://localhost:5000/auth/login'; $curl = curl_init($url); // 构造JSON请求体 $postData = json_encode([ 'email' => $email, 'password' => $password ]); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 添加JSON请求头,告知接口参数格式 curl_setopt($curl, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($postData) ]); // 移除多余的CURLOPT_USERPWD配置 curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); $result = curl_exec($curl); // 获取真实的HTTP状态码 $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); // 解析接口返回的JSON响应 $response = json_decode($result, true); // 结合状态码和接口返回的success字段判断登录结果 if ($httpCode === 200 && $response['success'] === 'true') { $_SESSION['alogin'] = $email; header("Location: admin/index.php"); exit; // 跳转后必须终止脚本执行,避免后续代码干扰 } else { // 展示接口返回的具体错误信息 $error = $response['message'] ?? "登录失败,请重试"; } curl_close($curl); } } ?>
内容的提问来源于stack exchange,提问作者Tinashe C
相关产品推荐
相关产品推荐

