我有一个代理容器,它向一个API容器发出curl请求。下面是代理容器的curl请求:
$postRequest = [
'email' => $_POST['email'],
'password' => $_POST['password']
];
pretty_var_dump($postRequest);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://api:80');
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_request);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, $post_request);
$curl_response = curl_exec($curl);
curl_close($curl);
$response = json_decode($curl_response, true);
pretty_var_dump($response);
下面是api文件的代码:
<?php
// return api results
header('Content-Type: application/json; charset=utf-8');
include_once('functions.php');
include_once('config.php');
$conn = new mysqli($host, $user, $pass, $mydatabase);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
} else {
echo "Connected to MySQL server successfully!";
}
$email = $_POST['email'];
$signin_password = $_POST['password'];
$select_query = "SELECT user_password, user_id, user_email, user_status FROM user_login WHERE user_email = '{$email}'";
echo $select_query;
$result = $conn->query($select_query);
if (isset($result)) {
$result = $result->fetch_all(MYSQLI_ASSOC);
pretty_var_dump($result);
if (isset($result[0])) {
$result = $result[0];
if (isset($result['user_password']) && $result['user_password']) {
if ($result['user_password']) {
if (isset($result['user_status']) && $result['user_status'] === "1" && isset($result['user_id'])) {
$_SESSION['loggedIn'] = $result['user_status'];
response(['user_id' => $result['user_id'], 'session' => $result['user_status']], 200, 'Sign in successful');
} elseif (isset($result['user_status']) && $result['user_status'] === "2" && isset($result['user_id'])) {
$_SESSION['loggedIn'] = $result['user_status'];
response(['user_id' => $result['user_id'], 'session' => $result['user_status']], 200, 'Sign in successful');
}
} else {
$_SESSION['loggedIn'] = false;
response('N/A', 401, 'Password incorrect');
}
}
} else {
response('N/A', 401, 'Email address not found');
}
}
由于某种原因,API文件没有从curl中阅读POST数据,因此每次都返回null。MYSQLI,curl都已安装,如果手动向API文件传递正确的用户名和密码,它将完美工作。
任何帮助都将不胜感激!
EDIT我已经更新了curl请求的代码,但是我仍然收到空值。api代码保持不变。是否有什么明显的地方我遗漏了?
$email = $_POST['email'];
$password = $_POST['password'];
// $data = http_build_query($postRequest);
$data = '{"email":"'.$email.'", "password":"'.$password.'"}';
$headers = array(
"Content-Type: application/json",
"Accept: application/json",
);
pretty_var_dump($data);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://127.0.0.1:86');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
$curl_response = curl_exec($curl);
curl_close($curl);
$response = json_decode($curl_response, true);
pretty_var_dump($response);
1条答案
按热度按时间7cjasjjr1#
更新
我怀疑你是否需要这些头。接受:是可以的,但这不是浏览器使用的。
内容类型错误。内容类型包含在响应标头中,这是请求标头。
它需要是一个键值,你只需要一个字符串。$headers = array('Accept:' =〉'应用程序/json ');
在电子邮件标题中,这些需要修复。
在响应中,您可以添加
更新结束
我刚把这个贴在另一个问题上。看起来你也可以用它。
这里肯定有问题。我怀疑$post_request是否同时属于CURLOPT_POSTFIELDS和CURLOPT_HTTPHEADER。
两种方法来制作你的帖子数据。
根据数据的不同,您可能需要使用urlencode()
我做了很多 curl 这些是我的标准后选项
这些是我的故障排除选项
您需要查看请求(输出)和响应头(输入),因此您需要这两个选项。
这两个选项必须在解决问题后才能出来。
如果是HTTPS,则需要以下选项:
我总是制作我自己的请求头。你可以删除这个选项,它不是强制性的。