{"id":26442149,"url":"https://github.com/ahmard/guzwrap","last_synced_at":"2025-03-18T10:17:48.310Z","repository":{"id":50785620,"uuid":"262687841","full_name":"Ahmard/guzwrap","owner":"Ahmard","description":"A GuzzleHttp object-oriented wrapper.","archived":false,"fork":false,"pushed_at":"2022-12-21T15:25:31.000Z","size":295,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-18T10:17:45.614Z","etag":null,"topics":["guzwrap","guzzle","guzzlehttp","http-client","http-requests","php","user-agent","wrapper"],"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/Ahmard.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}},"created_at":"2020-05-10T01:05:19.000Z","updated_at":"2025-03-11T20:16:00.000Z","dependencies_parsed_at":"2023-01-30T04:01:04.929Z","dependency_job_id":null,"html_url":"https://github.com/Ahmard/guzwrap","commit_stats":null,"previous_names":[],"tags_count":38,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahmard%2Fguzwrap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahmard%2Fguzwrap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahmard%2Fguzwrap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ahmard%2Fguzwrap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ahmard","download_url":"https://codeload.github.com/Ahmard/guzwrap/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244198395,"owners_count":20414443,"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":["guzwrap","guzzle","guzzlehttp","http-client","http-requests","php","user-agent","wrapper"],"created_at":"2025-03-18T10:17:47.460Z","updated_at":"2025-03-18T10:17:48.302Z","avatar_url":"https://github.com/Ahmard.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Guzwrap\n==============================================\n\nGuzwrap is an object-oriented wrapper around [GuzzleHttp](http://guzzlephp.org/). \u003cbr/\u003e\nThis project is founded to make sending request with Guzzle easier and enjoyable.\n\n## Supported PHP Versions\nGuzwrap require **PHP \u003e= 7.4 or \u003e= 8.0**.\n\n# Installation\n\nMake sure you have [Composer](http://getcomposer.org) installed.\n\n```bash\ncomposer require ahmard/guzwrap\n```\n\n# Usage\n\n```php\nuse Guzwrap\\Request;\n\n//simple request\n$result = Request::get('http://localhost:8002')-\u003eexec();\n\n//with authentication\nRequest::get('http://localhost:8002')\n    -\u003eauth('username', 'password')\n    -\u003eexec();\n```\n\n- get Guzwrap Instance\n\n```php\nuse Guzwrap\\Request;\n\n$instance = Request::create();\n//Do something...\n```\n\n- Request with cookies\n\n```php\nuse Guzwrap\\Request;\n\nRequest::create()-\u003eget('http://localhost:8002')\n    -\u003ewithCookie()\n    //or use cookie file\n    -\u003ewithCookieFile('path/to/file')\n    //use cookie session\n    -\u003ewithCookieSession('session_name')\n    //use array too\n    -\u003ewithCookieArray([\n        'first_name' =\u003e 'Jane',\n        'other_names' =\u003e 'Doe'\n    ], 'localhost')\n    //Use single cookie across requests\n    -\u003ewithSharedCookie();\n```\n\n- Handle redirects\n\n```php\nuse Guzwrap\\Request;\nuse Guzwrap\\Wrapper\\Redirect;\n\nRequest::get('http://localhost:8002')\n    -\u003eredirects(function(Redirect $redirect){\n        $redirect-\u003emax(5);\n        $redirect-\u003estrict();\n        $redirect-\u003ereferer('http://goo.gl');\n        $redirect-\u003eprotocols('http');\n        $redirect-\u003etrackRedirects();\n        $redirect-\u003eonRedirect(function(){\n            echo \"Redirection detected!\";\n        });\n    })-\u003eexec();\n```\n\n- Headers\n\n```php\nuse Guzwrap\\Request;\nuse Guzwrap\\Wrapper\\Header;\n\nRequest::get('http://localhost:8002')\n    -\u003eheader(function(Header $header){\n        $header-\u003eadd('hello', 'world');\n        $header-\u003eadd('planet', 'earth');\n    })\n    -\u003eexec();\n```\n\n- Query\n\n```php\nuse Guzwrap\\Request;\n\nRequest::get('https://google.com')\n    -\u003equery('q', 'Who is jane doe')\n    -\u003eexec();\n```\n\n- Post form data\n\n```php\nuse Guzwrap\\Request;\nuse Guzwrap\\Wrapper\\Form;\n\nRequest::uri('http://localhost:8002')\n    -\u003epost(function(Form $form){\n        $form-\u003efield('first_name', 'Jane');\n        $form-\u003efield('last_name', 'Doe');\n    })\n    -\u003eexec();\n\n//Post with multipart data\nRequest::uri('http://localhost:8002')\n  -\u003epost(function(Form $form){\n      $form-\u003emethod('post');\n      $form-\u003efield('full_name', 'Jane Doe');\n      $form-\u003efile('avatar', 'C:\\jane_doe.jpg');\n  })-\u003eexec();\n```\n\nYou can use [RequestInterface::form()](src/RequestInterface.php) method\n\n**Note:**  If you did not set form method to post, \nall your input fields will be treated as url queries.\n\n```php\nuse Guzwrap\\Request;\nuse Guzwrap\\Wrapper\\Form;\nuse Guzwrap\\Wrapper\\File;\n\nRequest::form(function (Form $form){\n    $form-\u003emethod('get'); //You can use any http method here\n    $form-\u003eaction('localhost:8002');\n    $form-\u003efield('name', 'Guzwrap');\n})-\u003eexec();\n\n//Send file with custom information\nRequest::form(function(Form $form){\n    $form-\u003emethod('post');\n    $form-\u003eaction('http://localhost:8002');\n    $form-\u003efield('full_name', 'Jane Doe');\n    $form-\u003efile(function(File $file){\n        $file-\u003efield('avatar');\n        $file-\u003epath('C:\\jane_doe.jpg');\n        $file-\u003ename('John_doe.gif');\n    });\n})-\u003eexec();\n```\n\n### More _Request_ usage\n\n- Use request data\n\n```php\nuse Guzwrap\\Request;\nuse Guzwrap\\UserAgent;\n\n//Basic usage\n$request = Request::query('artist', 'Taylor Swift')\n    -\u003euseData([\n        'headers' =\u003e [\n            'pass' =\u003e 'my-random-pass',\n            'user-agent' =\u003e 'My Custom Useragent',\n        ],\n        'query' =\u003e [\n            'action' =\u003e 'create'\n        ]       \n    ])-\u003eexec();\n\n//User other request's data\n$request1 = Request::userAgent(UserAgent::FIREFOX)\n    -\u003equery([\n        'username' =\u003e 'Ahmard',\n        'realm' =\u003e 'admin'\n    ]);\n\n$realRequest = Request::useData($request1-\u003egetData());\n```\n\n- Use request object\n\n```php\nuse Guzwrap\\Request;\nuse Guzwrap\\UserAgent;\n\n$request1 = Request::query('username', 'Ahmard');\n\n$request2 = Request::query('language', 'PHP')\n    -\u003euserAgent(UserAgent::CHROME)\n    -\u003eallowRedirects(false);\n\n$realRequest = Request::useRequest($request1, $request2); //Has request 1 and request 2 data\n```\n\n### Asynchronous Operations\n\n```php\nuse Guzwrap\\Request;\nuse Psr\\Http\\Message\\ResponseInterface;\n\n$promise = Request::get('localhost:8002')\n    -\u003equery('wraps', 'guzzlehttp')\n    -\u003equery('name', 'guzwrap')\n    -\u003eexecAsync();\n\n$promise-\u003ethen(function (ResponseInterface $response){\n    var_dump($response-\u003egetBody()-\u003egetContents());\n});\n\n$promise-\u003ewait();\n```\n\n- **Running multiple requests at once**\n  \n  * Create [PHP Built-in Server](https://www.php.net/manual/en/features.commandline.webserver.php)\n  ```bash\n  php -S localhost:8002 index.php\n  ```\n\n  * Create an **index.php** file and put below code into it\n  ```php\n  \\sleep($_GET['sleep']);\n  echo $_GET['sleep'];\n  ```\n  \n  * Crate **test.php** and put below code into it\n  ```php\n  use Guzwrap\\Request;\n  use Psr\\Http\\Message\\ResponseInterface;\n  \n  $promise = Request::get('localhost:8002')\n      -\u003equery('wraps', 'guzzlehttp')\n      -\u003equery('sleep', 2)\n      -\u003eexecAsync();\n  \n  $promise-\u003ethen(function (ResponseInterface $response){\n      var_dump($response-\u003egetBody()-\u003egetContents());\n  });\n  \n  $promise2 = Request::get('localhost:8002')\n      -\u003equery('name', 'guzwrap')\n      -\u003equery('sleep', 1)\n      -\u003eexecAsync();\n  \n  $promise2-\u003ethen(function (ResponseInterface $response){\n      var_dump($response-\u003egetBody()-\u003egetContents());\n  });\n  \n  $promise-\u003ewait();\n  $promise2-\u003ewait();\n  ```\n  \n  * Now run the **test.php** file\n  ```bash\n  php test.php\n  ```\n\n- **Using [Concurrent](src/Wrapper/Client/Concurrent.php) class\n  to manage [Guzzle Request Concurrency](https://docs.guzzlephp.org/en/stable/quickstart.html#concurrent-requests)**\n  ```php\n  use Guzwrap\\Request;  \n\n  $promise1 = Request::get('localhost:8002')-\u003eexecAsync();\n  $promise2 = Request::get('localhost:8002')-\u003eexecAsync();\n  \n  $responses = Request::concurrent($promise1, $promise2)-\u003eunwrap();\n  \n  echo $responses[0]-\u003egetStatusCode() . PHP_EOL;\n  echo $responses[1]-\u003egetReasonPhrase() . PHP_EOL;\n  ```\n\n* **Using request pool**\n  ```php\n  use Guzwrap\\Request;\n  use Guzwrap\\Wrapper\\Pool;\n  use GuzzleHttp\\Exception\\RequestException;\n  use GuzzleHttp\\Psr7\\Response;\n  use Psr\\Http\\Message\\ResponseInterface;\n  \n  require 'vendor/autoload.php';\n  \n  $pool = Request::pool(function (Pool $pool) {\n      $pool-\u003econcurrency(5);\n      $pool-\u003efulfilled(function (Response $response, $index) {\n          // this is delivered each successful response\n      });\n      $pool-\u003erejected(function (RequestException $reason, $index) {\n          // this is delivered each failed request\n      });\n  \n      $pool-\u003erequests(function ($total) {\n          $uri = 'http://127.0.0.1:8002';\n          for ($i = 0; $i \u003c $total; $i++) {\n              yield new \\GuzzleHttp\\Psr7\\Request('GET', $uri);\n          }\n      });\n  });\n  \n  $promise = $pool-\u003epromise();\n  \n  $promise-\u003ethen(function (ResponseInterface $response){\n      echo \"{$response-\u003egetStatusCode()} @ {$response-\u003egetReasonPhrase()}\\n\";\n  });\n  \n  $promise-\u003ewait();\n  ```\n\n### UserAgent\n\nWe provide custom user agents to help send request easily.\n\n```php\nuse Guzwrap\\Request;\nuse Guzwrap\\UserAgent;\n\nRequest::userAgent(UserAgent::CHROME);\n\n//Choose specific useragent index from array\nRequest::userAgent(UserAgent::CHROME, '1');\n\n//Choose sub-useragent\nRequest::userAgent(UserAgent::CHROME, '9.1');\n```\n\n- List user agents\n\n```php\nuse Guzwrap\\UserAgent;\n\n$userAgents = UserAgent::init()-\u003egetAvailable();\n```\n\n- Get random user agent\n\n```php\nuse Guzwrap\\UserAgent;\n\n$randomUA = UserAgent::init()-\u003egetRandom();\n```\n\n- Add user agents to the collection. \u003cbr/\u003e\n  Please take a look at user agent [definition sample](/src/data/ua/chrome.json)\n\n```php\nuse Guzwrap\\UserAgent;\n\nUserAgent::init()-\u003eaddFile('/path/to/user-agents.json');\n```\n\n- Use raw user agent\u003cbr/\u003e\n  Note that you can only pass Guzwrap\\UserAgent class to the request object, nothing more. \u003cbr/\u003e\n  This may open door to other possibilities in the future.\n\n```php\nuse Guzwrap\\UserAgent;\nuse Guzwrap\\Request;\n\n$request = Request::userAgent(UserAgent::raw('Browser 1.0 (Windows NT 10.0; Win64; x64)'));\n```\n\n### Stack\nManipulating Guzzle [StackHandler](https://docs.guzzlephp.org/en/stable/handlers-and-middleware.html#handlerstack) \n\n```php\nuse Guzwrap\\Request;\nuse GuzzleHttp\\Handler\\CurlHandler;\nuse GuzzleHttp\\HandlerStack;\n\nRequest::stack(function (HandlerStack $stack){\n    $stack-\u003esetHandler(new CurlHandler());\n    //Do something here\n});\n```\n\n### Middleware\nAdding [middleware](https://docs.guzzlephp.org/en/stable/handlers-and-middleware.html#middleware) to GuzzleHttp requests\n\n```php\nuse Guzwrap\\Request;\nuse Psr\\Http\\Message\\RequestInterface;\n\n/**\n * An example of middleware that add header to requests\n * @link https://docs.guzzlephp.org/en/stable/handlers-and-middleware.html\n */\nRequest::middleware(function(){\n    return function (callable $handler){\n        return function (\n            RequestInterface $request,\n            array $options\n        ) use ($handler){\n            $request = $request-\u003ewithHeader('X-Guzwrap-Version', 'V2');\n            return $handler($request, $options);\n        };\n    };\n});\n```\n\n### Extending Guzwrap\n\n```php\nuse Guzwrap\\Wrapper\\Guzzle;\nuse Psr\\Http\\Message\\ResponseInterface;\n\nrequire 'vendor/autoload.php';\n\nclass Client extends Guzzle\n{\n    public static function create(): Client\n    {\n        return new Client();\n    }\n\n    public function boom(): ResponseInterface\n    {\n        echo \"Executing request...\\n\";\n        return parent::exec();\n    }\n}\n\n$client = Client::create()\n    -\u003eget('localhost:8002')\n    -\u003ewithCookie()\n    -\u003eboom();\n```\n\n## Testing\nRust PHP built-in server before running the test\n```\nphp -S localhost:8002 -t tests/raw/\n```\n\nRun the test\n```\ncomposer test\n```\n\n**Enjoy 😎**","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahmard%2Fguzwrap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fahmard%2Fguzwrap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahmard%2Fguzwrap/lists"}