lichtner/laravel-mock-api

易于使用,但同时也是功能强大的微库,用于模拟外部API

0.8.3 2023-06-12 18:21 UTC

README

Laravel MockAPI 是一个专为模拟外部API和Web服务设计的强大且轻量级的库。

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

为什么选择它?

你正在开发过程中使用外部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_urlmock_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)。有关更多信息,请参阅许可文件