lichtner / laravel-mock-api
易于使用,但同时也是功能强大的微库,用于模拟外部API
Requires
- php: ^8.1
- illuminate/contracts: ^10.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- guzzlehttp/guzzle: ^7.5
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.9
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^8.0
- pestphp/pest: ^2.0
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
README
Laravel MockAPI 是一个专为模拟外部API和Web服务设计的强大且轻量级的库。
为什么选择它?
你正在开发过程中使用外部API和Web服务,这些服务也在开发中吗?它们是否不稳定、速度慢、偶尔返回错误结果或意外不可用?这让你头疼吗?我也是!这就是我创建MockApi的原因。
安装和设置后,MockApi将在后台保存您外部Web服务的所有请求,并在它们不可用时返回它们,就像真实的API一样。
安装
composer require lichtner/laravel-mock-api
现在您可以通过以下方式发布配置文件并运行迁移
php artisan mock-api:install
设置
模拟GET请求
创建一个简单的类,包装所有您的Http::get()
请求,例如:
app/HttpMock.php
<?php namespace App; use Illuminate\Http\Client\Response; use Illuminate\Support\Facades\Http; use Lichtner\MockApi\MockApi; class HttpMock { public static function get($url): Response { MockApi::init($url); $response = Http::get($url); MockApi::log($url, $response); return $response; } }
然后,在您的代码中的任何地方替换
Http::get($url);
为
HttpMock::get($url);
完成了!现在您可以开始模拟所有外部API GET请求(也许还有正在开发它们的人:-)
模拟POST、PUT、PATCH、DELETE请求
您还可以模拟变更请求,但如果您不需要,则不是必须的。
例如,要模拟POST请求,请在app/HttpMock.php
中添加以下内容
class HttpMock { /* ... here is function get() */ public static function post(string $url, array $data): Response { MockApi::init($url, $data, 'POST'); $response = Http::post($url, $data); MockApi::log($url, $response, 'POST'); return $response; } }
然后,在您的代码中的任何地方替换
Http::post($url, $data);
为
HttpMock::post($url, $data);
模拟其他HTTP方法非常类似。请查看示例应用程序文件/app/HttpMock.php
示例应用程序
您可以在示例应用程序中查看MockApi的完整用法
安全
默认情况下,MockApi仅在local
环境中工作!它不会影响其他环境!
使用方法
在您完成了设置中描述的更改后,所有HTTP请求都将保存到MockApi表中。但它们不会被使用。
模拟所有资源
为了返回模拟数据,请在.env
文件中添加以下内容
MOCK_API=true
您可以在安装后立即设置MOCK_API=true
。从那时起,所有外部资源将返回最后一次保存的成功响应。
如果您尝试请求尚未保存的资源,首先会进行真实请求并将其保存到模拟API表中,然后返回。
当您的Web服务恢复后,您可以将其更改为
MOCK_API=false
模拟管理
您可以在mock_api_url
和mock_api_url_history
表中管理您的模拟。
仅模拟某些资源
默认情况下,在表中设置为mock_api_url.mock = 1
。这意味着资源被模拟。如果您只想模拟其中的一部分,将其他设置为0
。
模拟过去的数据
默认情况下,MockApi返回最后一次保存的成功响应(状态< 300)。如果某些资源返回状态200和一些数据,但它们是不正确的,而昨天的数据是正确的,请将所有不正确的资源的mock_api_url.mock_before
时间戳设置在表中。
模拟错误请求
也许您想改进您的应用程序处理外部API错误的方式。您也可以模拟错误响应。检查表中是否有保存以前的此类响应。如果没有,为资源添加所需的错误响应,例如:
INSERT INTO mock_api_url_history SET mock_api_url_id=12345, status=404, content_type='application/json', data='{"code": 404, "message": "Resource not found"}', created_at=NOW()
在将资源的mock_api_url.mock_status = 404
设置到表中后,您将得到这个404响应。
模拟变更请求
类似于POST、PUT、PATCH、DELETE这样的突变请求不会在mock_api_url_history.data
字段中添加任何内容。如果没有任何更改,它们将返回你发送的相同数据。例如,对于
$response = HttpMock::post("$api/articles", [ 'userId' => 5, 'title' => 'title 1', 'body' => 'body 1', ]);
响应是
{ "userId": 5, "title": "title 1", "body": "body 1" }
特别是对于POST请求,你的实际API可能添加id
字段。为了模拟这种行为,你可以更新特定行的data
字段
UPDATE mock_api_url_history SET data='{"id": 1234}' WHERE id = 777;
然后,相同的请求响应将是
{ "userId": 5, "title": "title 1", "body": "body 1", "id": 1234 }
你可以在突变响应中添加任何内容(例如uuid等)。这些字段将递归地与你的json POST数据合并。
模拟具有相同URL和方法的两个请求
在表mock_api_url
中为(方法,URL)设置了唯一键,因此你无法模拟具有相同方法和URL的两个请求,这是预期的行为。但有时你可能需要这样做。也许你想用资源POST /articles
模拟两个标题不同的文章。为此,你可以创建一个专门的类来完成这个任务。
class HttpMockArticles { public static function post(string $url, array $data): Response { MockApi::init("$url/$data[title]", $data, 'POST'); $response = Http::post($url, $data); MockApi::log("$url/$data[title]", $response, 'POST'); return $response; } }
正如你所看到的,你只能为MockApi::init()
和MockApi::log()
函数修改$url
参数,但不能为真实请求Http::post()
修改。因此,两个标题不同的文章将被保存。
配置
有关配置的更多信息,请参阅config/mock-api.php
测试
composer test
变更日志
有关变更日志,请参阅releases。
鸣谢
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。