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

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
PHP如何识别用户的会话?PHP如何识别用户的会话?May 01, 2025 am 12:23 AM

phpientifiesauser'ssessionusessessionSessionCookiesAndSessionIds.1)whiwSession_start()被称为,phpgeneratesainiquesesesessionIdStoredInacookInAcookInamedInAcienamedphpsessidontheuser'sbrowser'sbrowser.2)thisIdAllowSphptptpptpptpptpptortoreTessessionDataAfromtheserverMtheserver。

确保PHP会议的一些最佳实践是什么?确保PHP会议的一些最佳实践是什么?May 01, 2025 am 12:22 AM

PHP会话的安全可以通过以下措施实现:1.使用session_regenerate_id()在用户登录或重要操作时重新生成会话ID。2.通过HTTPS协议加密传输会话ID。3.使用session_save_path()指定安全目录存储会话数据,并正确设置权限。

PHP会话文件默认存储在哪里?PHP会话文件默认存储在哪里?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

您如何从PHP会话中检索数据?您如何从PHP会话中检索数据?May 01, 2025 am 12:11 AM

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

您如何使用会议来实施购物车?您如何使用会议来实施购物车?May 01, 2025 am 12:10 AM

利用会话构建高效购物车系统的步骤包括:1)理解会话的定义与作用,会话是服务器端的存储机制,用于跨请求维护用户状态;2)实现基本的会话管理,如添加商品到购物车;3)扩展到高级用法,支持商品数量管理和删除;4)优化性能和安全性,通过持久化会话数据和使用安全的会话标识符。

您如何在PHP中创建和使用接口?您如何在PHP中创建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解释了如何创建,实施和使用PHP中的接口,重点关注其对代码组织和可维护性的好处。

crypt()和password_hash()有什么区别?crypt()和password_hash()有什么区别?Apr 30, 2025 pm 03:39 PM

本文讨论了PHP中的crypt()和password_hash()之间的差异,以进行密码哈希,重点介绍其实施,安全性和对现代Web应用程序的适用性。

如何防止PHP中的跨站点脚本(XSS)?如何防止PHP中的跨站点脚本(XSS)?Apr 30, 2025 pm 03:38 PM

文章讨论了通过输入验证,输出编码以及使用OWASP ESAPI和HTML净化器之类的工具来防止PHP中的跨站点脚本(XSS)。

See all articles

热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

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

热工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

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