Skip to content

destinygujun/curlmulti

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

CurlMulti 包用于发送配置化的 api 请求.

根据配置中的 url, 请求方式, 响应字段名称, 验签类等配置, 通过 GuzzleHttp 发送 http 请求.

安装

假设你的主项目目录为 <yourProject>

配置公司内部 composer 包仓库

确认 <yourProject>/composer.json 中的 repositories 配置项中有 packages.xin.com, 并且不强制使用 https 协议. 看起来如下:

{
    "config": {
        "secure-http": false
    },
    "repositories": [
        {
            "type": "composer",
            "url": "http://packages.xin.com"
        }
    ]
}

安装 CurlMulti

进入 <yourProject> 目录, 运行 composer require uxin/fetcher

注册 service provider & facade

如果你不使用 laravel/lumen, 则可以跳过这一步.

如果你使用的 laravel 的版本大于 5.5, 则会自动注册 service provider 和 facade(参见 https://laravel-news.com/package-auto-discovery), 也可以跳过这一步.

如果你使用的 lumen, 则只需要把以下两行加入到 <yourProject>/bootstrap/app.php 中对应位置即可:

<?php
// 注册 facade
if (!class_exists('CurlMuitl')) {
    class_alias(UXin\CurlMulti\CurlMultiFacade::class, 'CurlMulti');
}

// 注册 service provider
$app->register(UXin\CurlMulti\CurlMultiServiceProvider::class);

laravel 类似, 但是要修改的文件可能不一样, 具体参考 laravel官方文档

用法

<?php
/**
 * api 的配置可以放到专门的配置文件中, 这里直接使用数组
 */
$api = [
    'url' => 'http://fetcher.api.fin.ceshi.youxinjinrong.com/demo/apiFetcher', // 请求地址, **注意不能带参数**
    'method' => 'POST', // 请求方法, 默认 'GET'
    'timeout' => 0.01, // 超时 (秒)
    'codeField' => 'payload.code', // 响应码字段, 可用 `.` 形式嵌套, 默认为 'code'
    'dataField' => 'payload.data', // 响应数据字段, 可用 `.` 形式嵌套, 默认为 'data'
    'messageField' => 'payload.msg', // 响应消息字段, 可用 `.` 形式嵌套, 默认为 'message'
    'successCode' => 2, // 当响应码为此值时, 认定为请求成功. 默认为 1
    'signer' => DemoSigner::class, // 签名类, 见下一段代码
];

/**
 * 假设已经配置了 facade, 则可以直接使用 Fetcher::fetch() 形式
 * 否则需要自己生成 Fetcher 实例, 如下: new Fetcher(new GuzzleHttp\Client());
 *
 * fetch() 函数的参数说明如下:
 * 1. 一个参数是 api 配置数组
 * 2. 第二个参数是请求参数数组(可选)
 * 3. 第三个参数是 cookie 数组(可选) 如:
 */
$fetched = CurlMulti::send($api, ['parameter' => 'value']);

/**
 * fetcher() 函数始终返回一个 Fetched 对象 (此处即为 $fetched 变量), 可以通过此对象判断请求结果
 */
if ($fetched->ok()) { // 请求是否 ok
    var_dump([
        $fetched->code(), // 响应码
        $fetched->message(), // 响应消息
        $fetched->data() // 响应数据
    ]);
}
<?php
namespace App\Signers;

use UXin\CurlMulti\Signer\Signer;

class DemoSigner implements Signer
{
    /**
     * Signer 必须实现 sign() 方法. sign() 方法实现实际的签名逻辑
     */
    public function sign(array $payload) {
        return $payload + ['_sn' => 'abcdefg'];
    }
}

其他

根据各位使用中的情况, 后续新增特性可能包括:

  • 解析 xml 等其他形式的响应 (目前只适用于 json 响应)
  • 上传文件(multipart/form-data 以及 raw data)
  • 配合环境敏感的配置包, 设定指定的配置文件
  • 接口响应缓存 ?

如果你有其他的需求或点子, 可以直接联系项目作者

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages