当前位置: 首页 > article >正文

PHP:写接口与接口的调用(完整版,封装公共方法)

说明:绑定的资源详细展示了两个项目的接口、接口调用的实现,已经数据库的连接,目录展示更加一目了然,有需要可以下载资源,实际文章已经描述的很详细了

一、A页面-发送请求页面

1、说明

  • 发送请求部分,去调用接口的部分(语言不限,这里使用php)
  • 这里使用提交按钮发送请求
  • 初始数据为对象,通过json进行发送
  • 必要数据:接口的url;接口方提供的AccessKeyId,AccessKeySecret(可生成随机数,只要请求接口方和接口方对应便可发送请求;请求的参数
  • 通过cURL完成请求

2、代码

<!-- 这里是获取调用数据 -->
 
<?php
//连接数据库
require_once 'get_db_conn.php';
$conn = db_connect();
//提交表单
if (isset($_POST['Save'])) {
    //传入api 
    $url = 'http://localhost/apireceive/api/receive.php';
    //请求头
    $headers = array(
        'Content-Type: application/json',
        'AccessKeyId: 1XTAJKZSK02KMSZW47D2LSFQMMUV3LST',
        'AccessKeySecret: VS7EGQTB2CGWZXREL3QT3V72ZSRPYSXB'
    );
    //请求参数
    $json_data = '{
        "require1": "测试",
        "require2": "value2",
        "test3": "value3"
    }';
    // 初始化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页面-接口页面

1、说明

  • 调用公共方法,验证头信息正确性以及必填项是否
  • 提供必填参数,传递给公共方法进行验证
  • 获取解析后的参数,进行赋值
  • 执行数据库操作
  • 将请求的结果返回给A页面

2、代码

<?php
// 连接数据库
require_once '../get_db_conn.php';
$conn = db_connect();

// 引入公共代码库
require_once 'common.php';

// 定义必需的参数
$required_params = ['require1', 'require2'];
// $required_params = [];

// 处理请求并获取解析后的数据
$input_data = Common::handleRequest($required_params);

// 使用请求参数执行业务逻辑
$require1 = $input_data['require1'];
$require2 = $input_data['require2'];
$test3 = $input_data['test3'] ? $input_data['test3']: null; // 可选参数

// 调用方法查询数据
// $data = fun_select($require1, $require2, $test3, $conn);
$sql_select = "SELECT * FROM customers WHERE customer_name = '".$require1."'";
$result_select = mysqli_query($conn, $sql_select);

if ($result_select) {
    $data = [];
    while ($row = mysqli_fetch_assoc($result_select)) {
        $data[] = $row;
    }
} else {
    echo "SQL查询执行失败: " . mysqli_error($conn);
    return [];
}

// 返回成功响应
http_response_code(200);
echo json_encode(['data' => $data, 'msg' => 'success']);
?>

三、B页面-公共方法页面

1、说明

  • 封装B页面接收A页面的公共方法
  • 检测A页面发送请求时传递的头信息,主要是检测AccessKeyId和AccessKeySecret是否和设定的一致
  • 检测必填项是否填写
  • 解析A页面传递的参数,直接供B页面使用

2、代码

<?php
// Common.php

class Common {
    // 验证AccessKeyId和AccessKeySecret
    public static function validateAccessKeys($key_id, $key_secret) {
        // 实现验证逻辑,如果验证通过则返回true,否则返回false
        if ($key_id == '1XTAJKZSK02KMSZW47D2LSFQMMUV3LST' && $key_secret == 'VS7EGQTB2CGWZXREL3QT3V72ZSRPYSXB') {
            return true;
        }
        return false;
    }

    // 检查请求方法和Content-Type
    public static function checkRequestMethodAndContentType() {
        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
            http_response_code(405);
            echo json_encode(['error' => 'Method Not Allowed']);
            exit;
        }

        $content_type = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
        if (stripos($content_type, 'application/json') !== 0) {
            http_response_code(415);
            echo json_encode(['error' => 'Unsupported Media Type']);
            exit;
        }
    }

    // 获取并解析请求体中的JSON数据
    public static function getJsonRequestBody() {
        $input_json = file_get_contents('php://input');
        $input_data = json_decode($input_json, true);
        return $input_data;
    }

    // 检查请求体中是否有必需的参数
    public static function checkRequiredParameters($input_data, $required_params) {
        foreach ($required_params as $param) {
            if (!isset($input_data[$param])) {
                http_response_code(400);
                echo json_encode(['error' => 'Invalid Request Body']);
                exit;
            }
        }
    }

    // 处理API请求的入口方法
    public static function handleRequest($required_params) {
        // 设置响应头
        header('Content-Type: application/json');

        // 验证AccessKey
        $access_key_id = isset($_SERVER['HTTP_ACCESSKEYID']) ? $_SERVER['HTTP_ACCESSKEYID'] : '';
        $access_key_secret_provided = isset($_SERVER['HTTP_ACCESSKEYSECRET']) ? $_SERVER['HTTP_ACCESSKEYSECRET'] : '';
        if (!self::validateAccessKeys($access_key_id, $access_key_secret_provided)) {
            http_response_code(401);
            echo json_encode(['error' => 'Unauthorized']);
            exit;
        }

        // 检查请求方法和Content-Type
        self::checkRequestMethodAndContentType();

        // 获取并解析请求体中的JSON数据
        $input_data = self::getJsonRequestBody();

        // 检查请求体中是否有必需的参数
        self::checkRequiredParameters($input_data, $required_params);

        // 返回解析后的请求数据
        return $input_data;
    }
}
?>

四、未封装请求参考路径

​​​​​​​PHP:接口请求与被请求_php 请求接口-CSDN博客


http://www.kler.cn/a/507998.html

相关文章:

  • 深入理解 D3.js 力导向图:原理、调参与应用
  • Json转换类型报错问题:java.lang.Integer cannot be cast to java.math.BigDecimal
  • YoloV10改进策略:Neck层改进|EFC,北理提出的适用小目标的特征融合模块|即插即用
  • 【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
  • Html5 video标签学习
  • 从AI原理到模型演进及代码实践 的学习二
  • 【Docker系列】SpringBoot 项目如何动态指定配置文件
  • 国家统计局湖北调查总队副总队长张小青一行调研珈和科技农业遥感调查智能化算法
  • 环境变量设置之后,pycharm 中程序获取不生效?
  • MES设备日志采集工具
  • Git的基本命令以及其原理(公司小白学习)
  • springboot指定外置配置文件(没有docker)
  • 互联网黑话大全
  • 【Flink系列】10. Flink SQL
  • Zabbix实战第一步:完成在Ubuntu Server的安装部署
  • Docker部署MySQL 5.7:持久化数据的实战技巧
  • 算法入门(九)—— 无监督学习介绍与K-Means实战(内附Kaggle实战源码与数据集)
  • 第9章:基于Vision Transformer(ViT)网络实现的迁移学习图像分类任务:早期秧苗图像识别
  • C语言数据结构编程练习-双向带头循环链表的创销增删改查
  • 关于在 Kotlin DSL 中,ndk 的配置方式
  • Windows重装后NI板卡LabVIEW恢复正常
  • Linux内核编程(二十一)USB应用及驱动开发
  • Leetcode3097:或值至少为 K 的最短子数组 II
  • C 语言运算符的优先级和结合性
  • 解答二重积分
  • 智能化量化模型的前沿探索:中阳的崛起