nahid/apiz 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

nahid/apiz

最新稳定版本:v5.0.0

Composer 安装命令:

composer require nahid/apiz

包简介

Apiz is a boilerplate for REST API HTTP call manager

README 文档

README

APIZ is a PHP API Client Development Kit, it helps you to manage HTTP API call in OOP way. You can easily handle and isolate all kinds of REST API calls and their responses by using this package.

Requirements

  • PHP >= 5.5.9

Installations

composer require nahid/apiz

Configurations

There are no extra configurations for this package.

Usage

Lets see an example to consume API from https://reqres.in.

Suppose you need to create several API services for your project. Your service directory is app/Services. Now we are going to develop a service for https://reqres.in and make a class file ReqResApiService.php which will extend \Apiz\AbstractApi class.

namespace App\Services;

use Apiz\AbstractApi;

class ReqResApiService extends AbstractApi
{
    protected function getBaseURL()
    {
        return 'https://reqres.in';
    }
}

getBaseURL() is an abstract method of the AbstractApi class. You need to override this method to set the proper base URL for your API.

Few APIs have a common prefix in their URL. Like, here reqres.in have a prefix api on every endpoint. So, we'll override the getPrefix() method to define the Prefix.

namespace App\Services;

use Apiz\AbstractApi;

class ReqResApiService extends AbstractApi
{
    protected function getBaseURL()
    {
        return 'https://reqres.in';
    }

    protected function getPrefix()
    {
        return 'api';
    }
}

Now let's make a method to get all users info.

namespace App\Services;

use Apiz\AbstractApi;

class ReqResApiService extends AbstractApi
{
    protected function getBaseURL()
    {
        return 'https://reqres.in';
    }

    protected function getPrefix()
    {
        return 'api';
    }

    public function getAllUsers()
    {
        $response = $this->get('users');

        if ($response->getStatusCode() === 200) {
            return $response()->toArray();
        }

        return [];
    }
}

So, we are basically making a GET request to the URL https://reqres.in/api/users.

See, how easy it is to manage an API now?

Let's see another example.

Post Request with Form Params

public function createUser(array $data)
{
    $response = $this->withFormParams($data)
            ->post('create');

    if ($response->getStatusCode() === 201) {
        return $response()->toArray();
    }

    return null;
}

Default Headers

Sometimes we need to bind some headers with all the requests. Suppose if you want to deal with the Github API, you have to send access_token in every request with the headers. So APIZ provide you a handy way to deal with this problem. Just override AbstractApi::getDefaultHeaders().

protected function getDefaultHeaders()
{
    return [
        'access_token' => $_ENV['GITHUB_ACCESS_TOKEN'],
    ];
}

Cool, right?

You can easily use all HTTP verbs like get, post etc. It's totally hassle free. See more examples in the Examples Folder.

Query over Response Data

Sometimes we receive huge payload as a response from the APIs. It's quite daunting to parse proper data from that big payload.

No worries! We're using a powerful Query parser, named QArray by default to parse and query over the Response data.

Let's see how we can use this parser to parse the response we got for getAllUsers method from our previous example.

public function getFirstUser()
{
    $users = $this->get('users');
    return $users->query()->from('data')->first();
}

We're getting list of users in the data key in the response. From that we're collecting the first data. See, how easy it is!

You can find detail usage of the QArray here.

Additionally, there is a secret sauce for you.

If you don't want to query like: $users->query(), you can just do it like this: $users(). That means the response object is invokable and behave exactly like calling the query() method.

You're welcome. :D

Overriding HTTP Client

By default we are using Guzzle as our HTTP Client. But you are not bound to use this. You can easily use your own PSR7 supported HTTP Client with Apiz. Just pass an instance of your HTTP Client to our setClient() method. See an example here.

Here is our GuzzleClient to get an idea how your Client should look like:

<?php

namespace Apiz\Http\Clients;

use Apiz\Http\AbstractClient;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Psr7\Uri;
use GuzzleHttp\Exception\GuzzleException;
use Psr\Http\Message\ResponseInterface;

// Your client must extend the `AbstractClient`
class GuzzleClient extends AbstractClient
{
    public function getRequestClass()
    {
        // Return the Request class name of your PSR7 supported Client
        // This Request class must implement the Psr\Http\Message\RequestInterface
        return Request::class;
    }

    public function getResponseClass()
    {
        // Return the Response class name of your PSR7 supported Client
        // This Response class must implement the Psr\Http\Message\ResponseInterface        
        return Response::class;
    }

    public function getUriClass()
    {
        // Return the Uri class name of your PSR7 supported Client
        // This Uri class must implement the Psr\Http\Message\UriInterface        
        return Uri::class;
    }

    /**
     * @param mixed ...$args
     * @return ResponseInterface
     * @throws GuzzleException
     */
    public function send(...$args)
    {
        // In this method, implement how your Client execute the Request sending
        $client = new Client();

        return $client->send(... $args);
    }
}

List of methods for common HTTP verbs

  • get(string $uri)
  • post(string $uri)
  • put(string $uri)
  • delete(string $uri)
  • head(string $uri)
  • options(string $uri)

List of Available methods

  • getPrefix():string: override this method to define the common prefix, if you need it
  • setClient($client) : pass a PSR7 supported Client instance, only if you need to override the default Guzzle HTTP Client
  • withFormParams(array): pass Form parameters data for requests like POST, PATCH, UPDATE
  • withHeaders(array): pass Header data
  • withQueryParams(array): pass Query Parameter data
  • withFormData(array): pass Multipart form data
  • getDefaultHeaders():array: override to define default Headers, if you have any
  • getDefaultQueries():array: override to define default queries, if you have any
  • skipDefaultHeaders(bool)
  • skipDefaultQueries(bool)
  • allowRedirects(array)
  • basicAuth(string $username, string $password [, array $options])
  • body(string): Set request body
  • json(array): Set JSON data to be passed as Request Body
  • file(string $name, string $file_path, string $filename [, array $headers])
  • params(array $params)

Contribution

Feel free send feedback and issues. Contributions to improve this package is most welcome too.

nahid/apiz 适用场景与选型建议

nahid/apiz 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 11.66k 次下载、GitHub Stars 达 60, 最近一次更新时间为 2017 年 07 月 18 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 nahid/apiz 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 nahid/apiz 我们能提供哪些服务?
定制开发 / 二次开发

基于 nahid/apiz 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 11.66k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 60
  • 点击次数: 22
  • 依赖项目数: 4
  • 推荐数: 0

GitHub 信息

  • Stars: 60
  • Watchers: 3
  • Forks: 13
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2017-07-18