PHP:接口请求与被请求

A-系统:请求页面(使用的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
//连接数据库
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 [];
    }
}
?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/551418.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宝宝洗衣机买几公斤?四款精心挑选实用婴儿洗衣机推荐

家里有孩子的&#xff0c;条件允许的话&#xff0c;婴儿洗衣机还是非常有必要买的。由于宝宝的年纪还小&#xff0c;使得宝宝的皮肤比较娇嫩&#xff0c;与成人衣物分开洗护&#xff0c;可以为宝宝带来更加健康的生长环境&#xff0c;并且可以避免与大人衣物混洗所带来的细菌的…

【训练营】DateWhale——动手学大模型应用开发(更新中)

文章目录 写在前面大模型简介LLM简介RAG简介LangChain开发框架开发LLM应用的整体流程 写在前面 大模型时代从GPT爆发开始到现在已有一年多了&#xff0c;深度学习发展之快无法想象&#xff0c;一味感叹技术发展速度超越个人学习速度是没用的&#xff0c;倒不如花点时间参加一些…

其它IO合集

其它IO合集 1. 缓冲流1.1 概述1.2 字节缓冲流构造方法效率测试 1.3 字符缓冲流构造方法特有方法 2. 转换流2.1 字符编码和字符集字符编码字符集 2.2 编码引出的问题2.3 InputStreamReader类构造方法指定编码读取 2.4 OutputStreamWriter类构造方法指定编码写出转换流理解图解 3…

网络协议——IS-IS协议详解

1. IS-IS是什么 IS-IS是一种基于链路状态并使用最短路径优先算法进行路由计算的一种IGP协议。IS-IS属于内部网关协议&#xff0c;用于自治系统内部。IS-IS是一种链路状态协议&#xff0c;使用最短路径优先算法进行路由计算。 2. 应用场景&#xff08;园区网和骨干网&#xff0…

冯诺依曼与进程【Linux】

文章目录 冯诺依曼体系结构&#xff08;从硬件的角度描述&#xff09;冯诺依曼体系结构&#xff08;从软件的角度描述&#xff09;操作系统&#xff08;软件&#xff09;理解管理系统调用和库函数进程查看进程的两种方式 通过系统调用获取进程的PID和PPID通过系统调用创建进程-…

RAG学习笔记系列(一)

RAG 介绍 RAG 全称为 Retrieval Augmented Generation&#xff08;检索增强生成&#xff09;。是基于LLM构建系统的一种架构。 RAG 基本上可以理解为&#xff1a;搜索 LLM prompting。根据用户的查询语句&#xff0c;系统会先使用搜索算法获取到相关内容作为上下文&#xff0…

IMU应用于膝关节功能评估

近日&#xff0c;来自中国的研究团队开发了一款基于IMU的可穿戴系统&#xff0c;用于评估膝关节骨关节炎引发的功能障碍。研究着重重验证该系统在测量步态及下肢功能方面的准确性&#xff0c;通过对比业界公认的运动捕捉和步态分析系统&#xff0c;评估IMU传感器在这一领域的性…

Compose 简单组件

文章目录 Compose 简单组件TextText属性使用AnnotatedStringSpanStyleParagraphStyle SelectionContainer 和 DisableSelectionClickableText TextFieldTextField属性使用OutlinedTextFieldBasicTextFieldKeyboardOptions 键盘属性KeyboardActions IME动作 ButtonButton属性使用…

Python 数据结构和算法实用指南(三)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第七章&#xff1a;哈希和符号表 我们之前已经看过数组和列表&#xff0c;其中项目按顺序存储并通过索引号访问。索引号对计算机来说很有效…

Docker+Uwsgi+Nginx部署Django项目保姆式教程

之前&#xff0c;我和大家分享了在docker中使用uwsgi部署django项目的教程。这次&#xff0c;为大家带来的是使用DockerUwsgiNginx部署Django项目。废话不多说&#xff0c;我们开干。 步骤1&#xff1a;使用命令创建一个django项目 我这里python版本使用的是3.9.x 首先&#…

有爱有乐有知识,还有《米小圈上学记》!

“读万卷书&#xff0c;不如行万里路”&#xff0c;说的是读再多的书&#xff0c;也比不上走过万水千山所得。可是又有几人能得尝山水之妙&#xff0c;大多被困于尘世中。我虽走过一些山水&#xff0c;但大多因生存困于一隅&#xff0c;不得随心而行。 然而&#xff0c;读书也…

nmon进行性能资源监控

一、前言 在工作中可能会遇到需要在压测的时候对Linux服务器进行性能资源监控的情况。这时可以用nmon来对服务器进行监控。 二、nmon的下载安装 1.查看系统信息 cat /etc/os-release 结果为 PRETTY_NAME"Debian GNU/Linux 12 (bookworm)"NAME"Debian GNU/…

不用Linux也可以的强大文本处理方法

不用Linux也可以的强大文本处理方法 标题党了&#xff0c;其实是论VIM的使用。 做生物信息分析最合适的还是Linux操作系统&#xff0c;所以生信宝典在最开始就推出了Linux学习系列&#xff0c;由浅入深的讲述了Linux学习中的关键点。 主要文章列举如下&#xff1a; Linux学…

代码随想录算法训练营DAY25|C++回溯算法Part.2|216. 组合总和II、17.电话号码的字母组合

文章目录 216. 组合总和II题意理解树形结构伪代码实现剪枝操作CPP代码实现 17.电话号码的字母组合解题思路树形结构伪代码实现隐藏回溯CPP代码 216. 组合总和II 力扣题目链接 文章讲解&#xff1a;216. 组合总和III 视频讲解&#xff1a;和组合问题有啥区别&#xff1f;回溯算法…

python复制文件夹内容

参考博客 https://blog.csdn.net/itfans123/article/details/133710731 案例1 import os import shutildef copy_folder(source_folder, destination_folder):# 创建目标文件夹os.makedirs(destination_folder, exist_okTrue)# 遍历源文件夹中的所有文件和文件夹for item in …

【简单讲解下如何用爬虫玩转石墨文档】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

力扣算法-回溯

递归 104.二叉树的最大深度 回溯 17.电话号码的字母组合 ①子集型回溯 78.子集 (1)选不选 (2)选哪个 131.分割回文串 &#xff08;1593.拆分字符串使唯一子字符串的数目最大 也可以用这个思路解&#xff1a;从结果角度&#xff0c;分割字符串&#xff09; ②组合型回溯…

【C++】哈希二

上篇博客我们写了解决哈希冲突的两种办法&#xff0c;不过我们写的都是针对整形的&#xff0c;而在实际情况下&#xff0c;要存入哈希表中的数据可以是string或自定义类型等等。那么我们就应该想一种办法去解决这里的问题。 比如说string&#xff0c;我们想到如何让string也转为…

代码随想录算法练习Day11:链表相交

题目&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 题目链接&#xff1a;160.链表相交 题目思路&#xff1a;定义两个指针&#xff0c;分别遍历两链表&#xff0c;如…

后端获取请求体Body,将请求体进行解密放回Request请求,并能通过@RequestBody获取

目前系统发送的post和put请求都是没有加密数据。客户需要将请求体加密。而系统已经基本开发完成&#xff0c;不可能一个一个去修改发送的请求。就需要在发送请求时候在拦截器中将body进行加密。并且在后端进行请求过滤解密&#xff0c;并且能通过RequestBody继续获取对象。 1.…
最新文章