A-系统:请求页面(使用的php请求)
php
复制代码
<!-- 这里是获取调用数据 -->
<?php
//连接数据库
require_once 'get_db_conn.php';
$conn = db_connect();
//提交表单
if (isset($_POST['Save'])) {
//传入api
$url = 'http://XXX/project/api/external/test.php';
//请求头
$headers = array(
'Content-Type: application/json',
'AccessKeyId: 1XTAJKZSK02KMSZW47D2LSFQMMUV3LST',
'AccessKeySecret: VS7EGQTB2CGWZXREL3QT3V72ZSRPYSXB'
);
//请求参数
$json_data = '{
"datainfo": [
{
"require1": "require1_value",
"require2": "require2_value",
"test3": "test_value"
}
]
}';
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
// 设置了请求的目标URL
curl_setopt($ch, CURLOPT_URL, $url);
// 发出一个POST请求
curl_setopt($ch, CURLOPT_POST, true);
// 设置HTTP请求头信息
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// curl_exec()函数会将获取到的数据以字符串形式返回,而非直接输出到浏览器或标准输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 设置POST请求的主体数据。这里$json_data是一个JSON格式的字符串,它会被作为POST请求的数据部分发送给服务器。
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
// 在进行HTTPS连接时是否验证服务器的SSL证书,设置为false意味着cURL在连接时将跳过SSL证书验证过程
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 执行cURL请求
$response = curl_exec($ch);
// 检查cURL执行是否成功
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
} else {
// 处理响应数据
$result = json_decode($response, true);
// 根据API返回的数据进行后续操作...
echo json_encode($result); // 使用print_r()函数打印返回的数据以便于调试和查看
}
// 关闭cURL会话
curl_close($ch);
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8'); ?>" method="POST" enctype="multipart/form-data">
<div class="centre">
<input type="submit" name="Save" value="提交">
</div>
</form>
</body>
</html>
B-系统:被请求页面(test.php)
php
复制代码
<?php
//连接数据库
require_once 'get_db_conn.php';
$conn = db_connect();
// 在HTTP响应头中设置内容类型(Content-Type)为 application/json。告知客户端服务器即将发送的数据格式是JSON
header('Content-Type: application/json');
// 检查并验证AccessKeyId和AccessKeySecret(假设已实现验证函数)
// 这里仅为示例,实际应根据您的密钥管理系统进行验证
$access_key_id = isset($_SERVER['HTTP_ACCESSKEYID']) ? $_SERVER['HTTP_ACCESSKEYID'] : '';
$access_key_secret_provided = isset($_SERVER['HTTP_ACCESSKEYSECRET']) ? $_SERVER['HTTP_ACCESSKEYSECRET'] : '';
//调用方法validate_access_keys判断密钥是否正确
if (!validate_access_keys($access_key_id, $access_key_secret_provided)) {
//设置HTTP响应状态码为401,该状态码表示用户未经过授权,无法访问请求的资源。
http_response_code(401);
//返回错误信息给客户端
echo json_encode(['error' => 'Unauthorized']);
// 结束当前脚本的执行,不再执行后续的任何代码。
exit;
}
// 检查请求方法和Content-Type
// 超全局变量,用于获取当前HTTP请求的方法
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
// 客户端请求使用的方法(如GET、POST、PUT等)在服务器上针对指定资源不允许使用
http_response_code(405);
//返回错误信息给客户端
echo json_encode(['error' => 'Method Not Allowed']);
// 结束当前脚本的执行,不再执行后续的任何代码。
exit;
}
// 预定义的服务器变量,它包含了客户端在HTTP请求头中发送过来的Content-Type值。这个值描述了请求主体(POST数据或PUT数据等)的内容类型
$content_type = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
// 用stripos函数查找 $content_type 字符串中是否以 'application/json' 开头。stripos 函数与 strpos 类似,但它是不区分大小写的查找。
if (stripos($content_type, 'application/json') !== 0) {
// 表示服务器无法处理请求实体的媒体类型。
http_response_code(415);
//返回错误信息给客户端
echo json_encode(['error' => 'Unsupported Media Type']);
// 结束当前脚本的执行,不再执行后续的任何代码。
exit;
}
// 获取并解析请求体中的JSON数据
// 从特殊的PHP输入流 'php://input' 中读取数据。这个输入流提供了对HTTP请求正文(请求体)的访问,特别适用于POST请求中传输的非表单数据,例如JSON或XML格式的数据
$input_json = file_get_contents('php://input');
// json_decode 函数,该函数用于将JSON格式的字符串 $input_json 解析成PHP变量。这里的第二个参数设为 true,表示将JSON对象解码为PHP关联数组,而不是默认的StdClass对象
$input_data = json_decode($input_json, true);
// 检查请求体中是否有必需的参数(现在考虑嵌套结构)
if (!isset($input_data['datainfo'][0]['require1'], $input_data['datainfo'][0]['require2'])) {
// 如果没有找到所需的参数,则返回错误
http_response_code(400);
echo json_encode(['error' => 'Invalid Request Body']);
exit;
}
// 使用请求参数执行业务逻辑
$require1 = $input_data['datainfo'][0]['require1'];
$require2 = $input_data['datainfo'][0]['require2'];
// 注意:这里似乎没有'test3'在根级别的数据项,所以如果'test3'也在'data'数组内,则应该这么写:
$test3 = $input_data['datainfo'][0]['test3'];
//调用方法查询数据
$data = fun_select($require1, $require2, $test3, $conn);
// 返回成功响应
http_response_code(200);
echo json_encode(['data' => $data,'msg' => 'success','require1'=>$require1]);
/**
* 示例性验证AccessKeyId和AccessKeySecret的方法,实际项目中应实现自己的验证逻辑
*/
function validate_access_keys($key_id, $key_secret) {
// 实现验证逻辑,如果验证通过则返回true,否则返回false
//这里给出默认值
if($key_id == '1XTAJKZSK02KMSZW47D2LSFQMMUV3LST' && $key_secret == 'VS7EGQTB2CGWZXREL3QT3V72ZSRPYSXB'){
return true;
}
return false; // 默认返回false,仅做占位
}
//执行查询的方法
function fun_select($require1, $require2, $test3, $conn) {
$sql_select = "SELECT * FROM accountgroups";
$result_select = mysqli_query($conn, $sql_select);
// 检查查询是否成功
if ($result_select) {
// 将查询结果转换为数组
$data = [];
while ($row = mysqli_fetch_assoc($result_select)) {
$data[] = $row;
}
// 返回查询结果
return $data;
} else {
// 查询失败时返回错误信息或者空数组
echo "SQL查询执行失败: " . mysqli_error($conn);
return [];
}
}
?>