PHP:接口请求与被请求

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 [];
    }
}
?>
相关推荐
阿巴斯甜17 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker17 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952718 小时前
Andorid Google 登录接入文档
android
黄林晴20 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
BingoGo20 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack20 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android