首页 后端开发 php教程 从头开始构建REST API:实现

从头开始构建REST API:实现

Feb 20, 2025 am 10:13 AM

Build a REST API from Scratch: Implementation

>本教程的第一部分建立了我们API的基础层:服务器设置,身份验证,JSON处理,错误管理和初始路由。 至关重要的是,我们定义了读书文件中的资源和行动。现在,让我们通过实施这些资源来建立这个基础。

>

密钥概念:

  • >及时的最佳实践:创建和更新操作返回资源表示。 强大的ORM/模型和验证库对于生产应用程序至关重要。
  • >
  • 错误处理和验证:严格的错误处理和验证确保数据完整性和适当的响应。 这包括强制性字段(例如名字)和唯一的电子邮件检查。
  • 高级查询:>实现过滤,分类和分页,以进行有效的数据检索和改进的客户端性能。>
  • >缓存:>使用中间件的ETAG和服务器端缓存(例如APC),以进行优化的响应时间和减少的服务器加载。
  • 速率限制:
  • 基于中间件的限制限制API过度使用,确保可用性和可靠性。 通过考虑高级ORM/模型解决方案,外部验证库以及APC以外的替代存储选项, 未来的增强:
  • 可扩展性的计划。
  • > 联系人管理:创建和更新
>

>从联系创建开始,REST最佳实践决定创建或更新后返回资源表示。 虽然为清晰度简化了此示例中的数据库交互,但生产API将利用更强大的ORM/模型和验证库。>

本文

端点处理请求主体,验证数据,创建联系人记录,处理相关说明(如果提供),并返回创建联系人的JSON表示。 更新操作(

$app->post(
'/contacts',
function () use ($app, $log) {
    $body = $app->request()->getBody();
    $errors = $app->validateContact($body);

    if (empty($errors)) {
        $contact = \ORM::for_table('contacts')->create();

        if (isset($body['notes'])) {
            $notes = $body['notes'];
            unset($body['notes']);
        }

        $contact->set($body);

        if ($contact->save()) {
            if (!empty($notes)) {
                $contactNotes = [];
                foreach ($notes as $item) {
                    $item['contact_id'] = $contact->id;
                    $note = \ORM::for_table('notes')->create();
                    $note->set($item);
                    if ($note->save()) {
                        $contactNotes[] = $note->asArray();
                    }
                }
            }

            $output = $contact->asArray();
            if (!empty($contactNotes)) {
                $output['notes'] = $contactNotes;
            }
            echo json_encode($output, JSON_PRETTY_PRINT);
        } else {
            throw new Exception("Unable to save contact");
        }
    } else {
        throw new ValidationException("Invalid data", 0, $errors);
    }
}
);
登录后复制
登录后复制
)遵循类似的模式,在处理前检查联系并注意存在。

/contacts方法被映射到相同的代码以提高效率:> PUT PATCH PUT联系人列表和过滤PATCH

>
$app->map(
'/contacts/:id',
function ($id) use ($app, $log) {
    // Update code here...
})->via('PUT', 'PATCH');
登录后复制
登录后复制
基本联系人清单很简单:

但是,稳健的API支持高级查询:此示例通过

>进行过滤,在

>或

中搜索,使用
$app->get(
'/contacts',
function () use ($app, $log) {
    $contacts = \ORM::forTable('contacts')->findArray();
    echo json_encode($contacts, JSON_PRETTY_PRINT);
}
);
登录后复制
>,按

进行排序,然后选择特定字段。 该实施涉及对输入进行消毒和动态构建数据库查询:>

$app->post(
'/contacts',
function () use ($app, $log) {
    $body = $app->request()->getBody();
    $errors = $app->validateContact($body);

    if (empty($errors)) {
        $contact = \ORM::for_table('contacts')->create();

        if (isset($body['notes'])) {
            $notes = $body['notes'];
            unset($body['notes']);
        }

        $contact->set($body);

        if ($contact->save()) {
            if (!empty($notes)) {
                $contactNotes = [];
                foreach ($notes as $item) {
                    $item['contact_id'] = $contact->id;
                    $note = \ORM::for_table('notes')->create();
                    $note->set($item);
                    if ($note->save()) {
                        $contactNotes[] = $note->asArray();
                    }
                }
            }

            $output = $contact->asArray();
            if (!empty($contactNotes)) {
                $output['notes'] = $contactNotes;
            }
            echo json_encode($output, JSON_PRETTY_PRINT);
        } else {
            throw new Exception("Unable to save contact");
        }
    } else {
        throw new ValidationException("Invalid data", 0, $errors);
    }
}
);
登录后复制
登录后复制

本节将包括用于处理的详细代码fields>,sortpageper_page参数,构建查询和管理分页,包括生成Link>

>联系方式和嵌入式资源

>

检索单个联系方式很简单:

$app->map(
'/contacts/:id',
function ($id) use ($app, $log) {
    // Update code here...
})->via('PUT', 'PATCH');
登录后复制
登录后复制
为了提高效率,可以使用

等查询参数来获取嵌入式资源(例如,注释)。 如果存在/api/v1/contacts/1?embed=notes>参数,则将修改该代码以包含注释的附加查询。embed>

>缓存和速率限制> 使用中间件实施

>缓存和速率限制,增强性能和API保护。 中间件代码(用于缓存和限制速率)将类似于原始示例,处理缓存命中/错过,ETAG生成,到期和费率限制检查,包括适当的HTTP标头。

进一步的开发

>这种增强的API提供了坚实的基础。 未来的改进包括迁移到更强大的ORM/模型,集成了专用验证库,探索替代存储解决方案,实现API发现(例如Swagger)以及创建全面的测试套件。 完整的源代码(如原件中所述)将提供完整的实施详细信息。

>

以上是从头开始构建REST API:实现的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

PHP 8.1中的枚举(枚举)是什么? PHP 8.1中的枚举(枚举)是什么? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试? 在PHPStorm中如何进行CLI模式的调试? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何用PHP的cURL库发送包含JSON数据的POST请求? 如何用PHP的cURL库发送包含JSON数据的POST请求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

See all articles