{"id":20661262,"url":"https://github.com/sdpm-lab/anser-action","last_synced_at":"2025-06-21T20:07:48.398Z","repository":{"id":45566092,"uuid":"355728266","full_name":"SDPM-lab/Anser-Action","owner":"SDPM-lab","description":"A simple API connection library for PHP","archived":false,"fork":false,"pushed_at":"2023-11-26T09:39:53.000Z","size":191,"stargazers_count":6,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-21T20:07:42.905Z","etag":null,"topics":["php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SDPM-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-04-08T01:27:17.000Z","updated_at":"2024-01-18T19:35:05.000Z","dependencies_parsed_at":"2023-02-19T09:01:24.557Z","dependency_job_id":"de689721-454d-4da3-9642-70be8e310c16","html_url":"https://github.com/SDPM-lab/Anser-Action","commit_stats":{"total_commits":27,"total_committers":3,"mean_commits":9.0,"dds":"0.14814814814814814","last_synced_commit":"ccf3d3015e9dbd5722ea6b0555a57484bfb6d78f"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/SDPM-lab/Anser-Action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SDPM-lab%2FAnser-Action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SDPM-lab%2FAnser-Action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SDPM-lab%2FAnser-Action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SDPM-lab%2FAnser-Action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SDPM-lab","download_url":"https://codeload.github.com/SDPM-lab/Anser-Action/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SDPM-lab%2FAnser-Action/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261186776,"owners_count":23121944,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["php"],"created_at":"2024-11-16T19:08:08.355Z","updated_at":"2025-06-21T20:07:43.379Z","avatar_url":"https://github.com/SDPM-lab.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Anser-Action：A simple API connection library for PHP\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://i.imgur.com/2vRAcI0.png\" alt=\"logo\" width=\"500\" /\u003e\n\u003c/p\u003e\n\nAnser-Action is a library based on `Guzzle7`, it provides you the ability to handle HTTP responses and exceptions like using the `callback` design pattern of `jQuery Ajax`.\nBesides, Anser-Action is also able to achieve parallel connection swiftly, enables you to handle multiple HTTP connections and responses in a short time.\n\n## Installation\n\n### Requirements\n\n1. PHP 7.2.5↑\n1. Composer\n2. [Requirements](https://docs.guzzlephp.org/en/stable/overview.html#requirements) for installing Guzzle7\n\n### Composer installation\n\nUse Composer to download the needed dependencies and libraries under your project root directory.\n\n```\ncomposer require sdpmlab/anser-action\n```\n\n## Quick Start\n\n### Single HTTP Connection\n\nThrough the `Action` object provided by Anser, you can define your HTTP connection straightforwardly.\nBy setting up the `doneHandler`, you can design the execution logic when the connection succeeded, and then store the needed data inside `Action` object by means of `setMeaningData`.\n\n`Action` must call the `do()` method to execute connection, subsequently, you can take out the processed data through `getMeaningData()`.\n\n```php\nrequire './vendor/autoload.php';\n\nuse \\SDPMlab\\Anser\\Service\\Action;\nuse \\Psr\\Http\\Message\\ResponseInterface;\n\n$action = (new Action(\n    \"https://datacenter.taichung.gov.tw\",\n    \"GET\",\n    \"/swagger/OpenData/4d4847f5-4feb-4e9b-897c-508d2cbe1ed8\"\n))-\u003edoneHandler(function(\n    ResponseInterface $response,\n    Action $runtimeAction\n){\n    $body = $response-\u003egetBody()-\u003egetContents();\n    $data = json_decode($body, true);\n    $runtimeAction-\u003esetMeaningData($data);\n});\n\n$data = $action-\u003edo()-\u003egetMeaningData();\nvar_dump($data[0]);\n```\n\n### Error handling\n\nYou can set up `failHandler` callback function to define the processing logic when encountering HTTP connection errors, server errors, or the client errors.\n\n```php\n\u003c?php\nrequire './vendor/autoload.php';\n\nuse \\SDPMlab\\Anser\\Service\\Action;\nuse \\Psr\\Http\\Message\\ResponseInterface;\nuse \\SDPMlab\\Anser\\Exception\\ActionException;\n\n$action = (new Action(\n    \"https://error.endpoint\",\n    \"GET\",\n    \"/dfgdfg\"\n))-\u003edoneHandler(function (\n    ResponseInterface $response,\n    Action $runtimeAction\n) {\n    $body = $response-\u003egetBody()-\u003egetContents();\n    $data = json_decode($body, true);\n    $runtimeAction-\u003esetMeaningData($data);\n})-\u003efailHandler(function (\n    ActionException $e\n) {\n    if($e-\u003eisClientError()){\n        $e-\u003egetAction()-\u003esetMeaningData([\n            \"code\" =\u003e $e-\u003egetStatusCode(),\n            \"msg\" =\u003e \"client error\"\n        ]);\n    }else if ($e-\u003eisServerError()){\n        $e-\u003egetAction()-\u003esetMeaningData([\n            \"code\" =\u003e $e-\u003egetStatusCode(),\n            \"msg\" =\u003e \"server error\"\n        ]);\n    }else if($e-\u003eisConnectError()){\n        $e-\u003egetAction()-\u003esetMeaningData([\n            \"msg\" =\u003e $e-\u003egetMessage()\n        ]);\n    }\n});\n\n$data = $action-\u003edo()-\u003egetMeaningData();\nvar_dump($data);\n```\n\n### Concurrent Connection\n\nYou can directly use the `ConcurrentAction` class provided by the library.\nBy passing multiple `Action` entities, you will be able to achieve parallel connection fastly, and get the processed results uniformly.\n\n```php\n\u003c?php\nrequire './vendor/autoload.php';\n\nuse \\SDPMlab\\Anser\\Service\\Action;\nuse \\Psr\\Http\\Message\\ResponseInterface;\nuse \\SDPMlab\\Anser\\Service\\ConcurrentAction;\n\n$action1 = (new Action(\n    \"https://datacenter.taichung.gov.tw\",\n    \"GET\",\n    \"/swagger/OpenData/4d4847f5-4feb-4e9b-897c-508d2cbe1ed8\"\n))-\u003eaddOption(\"query\",[\n    \"limit\" =\u003e \"1\"\n])-\u003edoneHandler(function(\n    ResponseInterface $response,\n    Action $runtimeAction\n){\n    $body = $response-\u003egetBody()-\u003egetContents();\n    $data = json_decode($body, true);\n    $runtimeAction-\u003esetMeaningData($data);\n});\n\n$action2 = (new Action(\n    \"https://datacenter.taichung.gov.tw\",\n    \"GET\",\n    \"/swagger/OpenData/bec13df0-4648-41e9-838d-132705a45308\"\n))-\u003eaddOption(\"query\",[\n    \"limit\" =\u003e \"1\"\n])-\u003edoneHandler(function(\n    ResponseInterface $response,\n    Action $runtimeAction\n){\n    $body = $response-\u003egetBody()-\u003egetContents();\n    $data = json_decode($body, true);\n    $runtimeAction-\u003esetMeaningData($data);\n});\n\n$action3 = (new Action(\n    \"https://datacenter.taichung.gov.tw\",\n    \"GET\",\n    \"/swagger/OpenData/b81b1fc6-a2f0-406a-a78c-654cc0088782\"\n))-\u003eaddOption(\"query\",[\n    \"limit\" =\u003e \"1\"\n])-\u003edoneHandler(function(\n    ResponseInterface $response,\n    Action $runtimeAction\n){\n    $body = $response-\u003egetBody()-\u003egetContents();\n    $data = json_decode($body, true);\n    $runtimeAction-\u003esetMeaningData($data);\n});\n\n$concurrent = new ConcurrentAction();\n$concurrent-\u003esetActions([\n    \"action1\" =\u003e $action1,\n    \"action2\" =\u003e $action2,\n    \"action3\" =\u003e $action3\n])-\u003esend();\nvar_dump($concurrent-\u003egetActionsMeaningData());\n```\n\n### Centralized Connection Management\n\nInherit `\\SDPMlab\\Anser\\Service\\SimpleService` class to manage and make similar connections abstract.\nThese connections will be able to share basic configurations with each other, and through this design pattern, you can reduce code replication maximally and enhance maintainability as well.\n\n```php\n\u003c?php\nrequire './vendor/autoload.php';\n\nuse \\SDPMlab\\Anser\\Service\\Action;\nuse \\Psr\\Http\\Message\\ResponseInterface;\nuse \\SDPMlab\\Anser\\Service\\SimpleService;\n\nclass TaichungService extends SimpleService\n{\n\n    protected $serviceName = \"https://datacenter.taichung.gov.tw\";\n    protected $retry = 1;\n    protected $retryDelay = 1.0;\n    protected $timeout = 2.0;\n    protected $options = [\n        \"query\" =\u003e [\n            \"limit\" =\u003e \"1\"\n        ]\n    ];\n\n    public function getAction1(): Action\n    {\n        return $this-\u003egetAction(\"GET\", \"/swagger/OpenData/4d4847f5-4feb-4e9b-897c-508d2cbe1ed8\")\n            -\u003edoneHandler($this-\u003esameDoneHandler());\n    }\n\n    public function getAction2(): Action\n    {\n        return $this-\u003egetAction(\"GET\", \"/swagger/OpenData/bec13df0-4648-41e9-838d-132705a45308\")\n            -\u003edoneHandler($this-\u003esameDoneHandler());\n    }\n\n    public function getAction3(): Action\n    {\n        return $this-\u003egetAction(\"GET\", \"/swagger/OpenData/b81b1fc6-a2f0-406a-a78c-654cc0088782\")\n            -\u003edoneHandler($this-\u003esameDoneHandler());\n    }\n\n    protected function sameDoneHandler(): callable\n    {\n        return function (\n            ResponseInterface $response,\n            Action $runtimeAction\n        ) {\n            $body = $response-\u003egetBody()-\u003egetContents();\n            $data = json_decode($body, true);\n            $runtimeAction-\u003esetMeaningData($data);\n        };\n    }\n}\n\n$taichungService = new TaichungService();\nvar_dump($taichungService-\u003egetAction1()-\u003edo()-\u003egetMeaningData());\nvar_dump($taichungService-\u003egetAction2()-\u003edo()-\u003egetMeaningData());\nvar_dump($taichungService-\u003egetAction2()-\u003edo()-\u003egetMeaningData());\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsdpm-lab%2Fanser-action","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsdpm-lab%2Fanser-action","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsdpm-lab%2Fanser-action/lists"}