21

48 天前

那我贴出来吧。为什么要有 facade 等东西,目的就是为了实现 “调用方式不变,实现方式可变”啊。

```

require_once(__DIR__.'/vendor/autoload.php'); //@DUCKPHP_HEADFILE

use think\api\Client;

use GuzzleHttp\Client as GuzzleHttp_Client;

use GuzzleHttp\HandlerStack ;

use think\helper\Str;

trait SingletonExTrait

{

protected static $_instances = [];

public static function G($object = null)

{

if (defined('__SINGLETONEX_REPALACER')) {

$callback = __SINGLETONEX_REPALACER;

return ($callback)(static::class, $object);

}

//fwrite(STDOUT,"SINGLETON ". static::class ."\n");

if ($object) {

self::$_instances[static::class] = $object;

return $object;

}

$me = self::$_instances[static::class] ?? null;

if (null === $me) {

$me = new static();

self::$_instances[static::class] = $me;

}

return $me;

}

}

class MyService

{

use SingletonExTrait;

public $options =[

'endpoint' => 'https://api.topthink.com/',

'app_code' => '???',

'default_http_method'=>'GET',

];

public function init(array $options, object $context = null)

{

$this->options = array_intersect_key(array_replace_recursive($this->options, $options) ?? [], $this->options);

}

protected function do_call($method, $args)

{

$http_method = $this->get_http_method($method);

$uri = $this->get_uri($method);

$parameters = $this->get_parameters($method, $args);

try {

return $this->do_request($this->options['endpoint'], $this->options['app_code'], $http_method, $uri, $parameters);

} catch (RequestException $e) {

if ($e->hasResponse()) {

$response = $e->getResponse();

throw new Exception($response->getStatusCode(), $response->getBody()->getContents());

}

throw $e;

}

}

protected function get_http_method($method)

{

return $this->options['default_http_method'];

}

protected function get_uri($method)

{

//TODO 移除 Str 的引用

return $this->uri_map[$method] ?? Str::snake(class_basename($method), "/");

}

protected function get_parameters($method, $args)

{

$reflect = new \ReflectionMethod($this, $method);

$ret=[];

$params = $reflect->getParameters();

foreach ($args as $i => $v) {

if($v === null){

continue;

}

$name = $params[$i]->getName();

$ret[$name] = $v;

}

return $ret;

}

protected function do_request($endpoint, $app_code, $method, $uri, $parameters)

{

$body =[];

if ($method == 'GET') {

$options['query'] = $data;

} else {

$options['body'] = $data;

}

$handleStack = HandlerStack::create(null);

$client = new GuzzleHttp_Client([

'base_uri' => $endpoint,

'handler' => $handleStack,

'headers' => [

'Authorization' => "AppCode ".$app_code,

'User-Agent' => "ThinkApi/1.0",

],

'verify' => false,

]);

$response = $client->request($method, $uri, $options);

$result = $response->getBody()->getContents();

if (false !== strpos($response->getHeaderLine('Content-Type'), 'application/json')) {

$result = json_decode($result, true);

}

return $result;

}

}

// 这个类用脚本生成,省略更多

class CalendarService extends MyService

{

/**

* 查日历

*

* @access public

* @param mixed $year_month

*/

public function calendarMonth($yearMonth = null){

return $this->do_call(__FUNCTION__, func_get_args());

}

}

class LocalCalendarService extends CalendarService

{

public function calendarMonth($yearMonth = null){

return ['这是模拟数据'];

}

}

//*

// 这里是核心工程师老大的干活

//CalendarService::G(LocalCalendarService::G()); // 线上出问题的时候切这句

$options=['app_code'=>'???'];

CalendarService::G()->init($options);

下面是小弟写

$result = CalendarService::G()->calendarMonth('2019-1');

var_dump($result);

return;

//*/

$client = new Client('???');

$result = $client->calendarMonth()->withYearMonth('2019-1')->request();

var_dump($result);

```

php调用txt接口,PHP 如何更优雅地调用 API 接口相关推荐

  1. 唯品会关键字搜索商品API接口(item_search-按关键字搜索唯品会商品API接口),唯品会API接口

    一.唯品会关键字搜索商品API接口(item_search-按关键字搜索唯品会商品API接口),唯品会API接口接口可获取到宝贝标题,宝贝价格,宝贝ID,宝贝图片,优惠价,宝贝链接,卖家昵称,店铺所在 ...

  2. 京东推荐商品列表API接口-(item_recommend-获取推荐商品列表API接口),京东API接口

    一.京东推荐商品列表API接口-(item_recommend-获取推荐商品列表API接口),京东API接口代码对接如下: 1.请求参数: 名称 类型 必须 描述 key String 是 调用key ...

  3. 京东商品评论API接口-(item_review-获得JD商品评论API接口),京东API接口

    一.京东商品评论API接口-(item_review-获得JD商品评论API接口),京东API接口代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GE ...

  4. tmall.product.schema.add(淘宝天猫商品发布接口),淘宝商品发布API接口,tmall.product.schema.get产品信息获取接口

    tmall.product.schema.add(淘宝天猫商品发布接口),淘宝商品发布API接口,可以用于店铺发货,店铺订单详情获取,店铺明文接口,订单同步,订单推送等业务,下面是一套完整的订单发货的 ...

  5. 1688搜索新品API接口-(按关键字搜索新品数据API接口)

    一.1688搜索新品API接口-(按关键字搜索新品数据API接口)代码如下: 1.公共参数: 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secre ...

  6. 亚马逊商品详情API接口-(item_get-获得AMAZON商品详情接口),亚马逊详情API接口

    一.亚马逊商品详情API接口-(item_get-获得AMAZON商品详情接口),亚马逊详情API接口可以获取到商品价格,商品库存,商品销量,商品ID,商品图片,商品sku属性,sku详情,sku图片 ...

  7. 1688搜索工厂数据API接口-(item_search_factory-按关键字搜索工厂数据API接口)

    一.1688搜索工厂数据API接口-(item_search_factory-按关键字搜索工厂数据API接口)代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用key ...

  8. 微店商品详情API接口(item_get-获得微店商品详情API接口),微店API接口

    一.微店商品详情API接口(item_get-获得微店商品详情API接口),微店API接口代码对接可以获取到宝贝ID,宝贝标题,价格,掌柜名称,库存,最小购买数,宝贝链接,宝贝图片,品牌名称,商品详情 ...

  9. tmall.product.schema.get( 淘宝天猫商品发布API接口) ,淘宝商品发布API接口,淘宝店铺上传API接口,oAuth2.0店铺上传API接口

    tmall.product.schema.get( 淘宝天猫商品发布API接口) ,淘宝商品发布API接口,淘宝店铺上传API接口,oAuth2.0店铺上传API接口,可适用于店铺上传商品,店铺发货, ...

最新文章

  1. PL/SQL三种集合类型的比较
  2. 用产品思路建设中台,这走得通吗?| 白话中台
  3. Python基础之最大公约数与最小公倍数
  4. Kubernetes 1.6新特性
  5. 简单实现实时输入网页,参考vue底层实现
  6. 给你安利一款国产良心软件uTools
  7. Media Player Classic - HC 源代码分析 1:整体结构
  8. 【学术新闻】强强联合!Papers with Code携手arXiv,上传论文、提交代码一步到位...
  9. Windows下安装elastic search
  10. ruby 基础知识(一)
  11. 西门子、安川、三菱伺服技术完全精通系列丛书!
  12. jackson java用法_Jackson 使用方法总结
  13. 【OpenCV笔记】光流法之金字塔Lucas-Kanade
  14. Python Numpy的数组array和矩阵matrix
  15. 用opencv检测convexity defects
  16. MySQL学习笔记(六)索引类别
  17. 怎么提取伴奏?有什么实用的提取软件?
  18. 直播平台接入美颜SDK已成刚需,它将带来哪些影响?
  19. 国标GB/T28181视频流媒体网页无插件直播服务4G摄像头无插件直播国标GB28181协议注册、心跳和注销协议说明介绍
  20. 一文读尽“数字化咨询”

热门文章

  1. Spring MVC 解读——@Autowired
  2. Percona Cluster集群讲解
  3. Exchange2007中创建和访问公用文件夹
  4. IDEA调试SpringMvc项目时,出错:找不到ContextLoaderListener
  5. 二叉树的遍历(包括递归和非递归方法)
  6. 多组学-ATAC-seq-概念
  7. 梯度提升决策树GBDT及其优秀改进XGBoost的浅析
  8. 字符流中第一个不重复的字符 python实现
  9. Spring Cloud微服务实战pdf
  10. Windows快捷键集锦