PHP 如何更优雅地调用 API 接口

2021-01-20 16:53:37 +08:00
 topthink

API 接口在各种场景中已经非常普遍使用,通常在 PHP 后台调用 API 接口,需要通过 Curl 库来自己封装,且不说各种充值门槛,还要被各种 api 接口平台的 appKey 、appSecret 之类的参数困惑,没法实现统一调用,很多小白更是被 Curl 各种配置参数弄得头大。ThinkPHP官方出品的ThinkAPI服务正是为了解决 PHP 接口调用的各种麻烦问题。

ThinkAPI统一API接口服务是由官方联合合作伙伴封装的一套接口调用服务及 SDK,旨在帮助ThinkPHP开发者更方便和更低成本调用官方及第三方的提供的各类API接口及服务,从而更好的构建开发者生态。

通过ThinkAPI提供的 SDK 功能可以以更优雅的方式来调用 API 接口,首先需要在你的项目里面安装 think-api 库(适用于任何 PHP5.6+项目,没有任何框架要求)。

composer require topthink/think-api

然后就可以调用你需要的接口进行查询和返回数据,支持ThinkAPI所有的 API 接口,以查询身份证所属地区接口为例:

use think\api\Client;

$client = new Client("appCode");

$result = $client->idcardIndex()
    ->withCardno('身份证号码')
    ->request();

idcardIndex方法就是调用了身份证归属地查询接口 withCardno方法则表示传入了cardno参数,如果还需要传入更多的参数则链式调用更多的方法即可,最后通过request方法进行实际调用并返回数据。通过 IDE 配合的话,你不需要自己记住任何接口方法名和参数方法名,都会有自动提示。

ThinkAPI所有的 API 调用服务必须设置appCode值(只需要注册一个账号即可获取),用于接口调用的身份认证。如需多次调用的话,建议自己在项目里面封装一个助手函数,例如:

use think\api\Client;

/**
 * API 接口调用助手函数
 * @return Client
 */
function api(): Client
{
    return new Client('yourAppCode');
}

// 调用示例
$result = api()->idcardIndex()
    ->withCardno('身份证号码')
    ->request();

所有的接口服务和方法都支持 IDE 自动提示和完成(请务必注意方法大小写必须保持一致),所有的返回数据都是 JSON 格式,因此基本上不需要文档即可完成接口开发工作。API 接口调用中的一些常见问题通过系统的方法封装都可以规避掉,你甚至不需要关心接口是要用 GET 还是 POST,都是系统自动处理的。

SDK 把所有接口和参数都封装为一个个独立的方法,你可以像调用一个类的方法一样简单的调用官方支持的任何 API 接口,也无需再去记住每个接口的参数有哪些。

如果你的环境不支持 Composer 或者 PHP 版本过低,可能需要你自己封装 Curl 库来调用接口。ThinkAPI 接口文档都提供了两种方式调用:直接调用接口地址和使用 SDK 调用。

目前 ThinkAPI 已经接入包括实名认证、人工智能、电子商务、新闻资讯和生活服务等类目在内的常用 API 接口共 269 个,包含大量免费接口,付费接口的价格比较实在、门槛也低,并且还在陆续扩充中。更详细的用法可以参考: https://docs.topthink.com/think-api

3364 次点击
所在节点    PHP
25 条回复
ben1024
2021-01-20 18:04:08 +08:00
推荐的是付费接口,没有免费接口服务列表吗
topthink
2021-01-20 19:27:43 +08:00
@ben1024 https://docs.topthink.com/think-api/1888715 这里有 标注为免费的就是免费接口
lepig
2021-01-20 21:40:14 +08:00
这个对开发来说确实听友好的。但是奈何老板不同意。

老板说,用付费的金接口,我要你们干啥。
topthink
2021-01-20 21:53:02 +08:00
@lepig 现代化开发理念不是什么都要自己独立开发的。每个接口做自己专业的事情 因为专注才能更专业 就和组件化开发一样 接口化也是一种趋势。而且大多数接口自己没有数据没法开发的,比如身份证实名认证 只能调用第三方的。那么 ThinkAPI 的优势就是帮你简化开发 同时也能降低成本。我认为老板关注的不是用不用接口的问题 是项目什么时候能上线的问题吧~
Actrace
2021-01-20 22:06:23 +08:00
@topthink 我觉得可能他就是那个老板 😀
imgbed
2021-01-20 22:18:02 +08:00
这种付费接口很多商家在做
lepig
2021-01-20 22:38:06 +08:00
@Actrace 我还真不是。只是我们 cto 为了节约成本新申请了个阿里云账号。然后迁移所有的服务器 /oss/容器等等。然后基础运维部断断续续肝了一个多月才完成。java,php 的所有项目全部要更改配置。
坑的一笔。
> 我是 php 开发。
zpfhbyx
2021-01-21 13:17:16 +08:00
把自己的三方 sdk 放到你那?
topthink
2021-01-21 15:45:37 +08:00
@imgbed 接口平台确实很多 但我们的优势是提供优雅的 SDK 以及更低的门槛
@zpfhbyx 没太明白你的意思 是指接口入驻么?
topthink
2021-01-21 15:47:52 +08:00
@lepig 你们这样迁移风险太大了吧 难不成每年重新申请一个账号么 哈哈
lepig
2021-01-21 15:50:58 +08:00
@topthink 我觉得真的可能干的出来。反正今年 2/3 时间都是 996. 明年准备溜了,不管了。
unicloud
2021-01-21 16:22:08 +08:00
看标题,以为是技术讨论。
zpfhbyx
2021-01-21 16:38:09 +08:00
@topthink 额,你不就是一个各种 3 方 api 的代理么。无非就是写了一个更好用的 phpsdk 。。
ztxcccc
2021-01-21 17:04:55 +08:00
标题和内容有什么关系吗?
dvaknheo
2021-01-21 18:02:36 +08:00
@topthink 提供优雅的 SDK

什么叫优雅:

老大:想查身份证地区编码,你们这么调就够了:
```
/** @var string */ $area = IdCardService::G()->idcardIndex('身份证号');
```
小弟:收到.

几天后,
小弟:报告老大 ,我们身份证地区编码得不到了
老大:收到。现在改
老大:打开入口代码
```
// IdCardService::G(AliIdService::G());
IdCardService::G(TencentIdService::G());
```
老大:好了,已经由接入 A 家改为接入 T 家了。

出错的时候跟踪方便。切换服务提供商方便。小弟们不需要乱动,这才叫优雅。
dvaknheo
2021-01-21 18:10:33 +08:00
再来个优雅的:

$client = new Client("YourAppCode");

$result = $client->gstoreDisease()
->withSymptom('发烧')
->request();

老板: 免费接口,每日 100 次免费调用,会员可不限次数调用。 我们接口要烧那么多钱么?减少调用!

老大:没问题。

```
class MyService{ function gstoreDisease($Symptom ){
// 如果我们数据库已经有,返回数据库已经存好的
// 如果数据库没有,则请求第三方并存入数据
}}
小弟代码不变
// ...
$result = MyService::G()->gstoreDisease('发烧');
```
dvaknheo
2021-01-21 21:00:33 +08:00
立一个 flag,我重写一个客户端,这三天内完成
imgbed
2021-01-21 21:50:12 +08:00
@topthink tp 我是支持的,api 目前还没用到,可能后续有需求吧
dvaknheo
2021-01-22 00:13:20 +08:00
写好了,一百五十多,放这里可能太长,又没排版 就是实现上述代码的第三方 think-api 接入类。
有人感兴趣的话我就贴在这
topthink
2021-01-22 10:31:47 +08:00
@dvaknheo 欢迎探讨 我只是说如何更优雅 我也没说是最优雅的 没必要抠字眼,至少目前我没有看到第三方的接口 SDK 有更好的
@zpfhbyx 没错 就是通过封装一个更好用的 SDK 让接口可以更优雅的调用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/746743

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX