动手做接口前应该注意哪些问题?

  • 接口认证
  • 接口参数格式字段
  • 接口版本 保留几个版本 什么情况下需要强制升级
  • 自动化测试问题
  • 模块化分
  • 接口统计问题
  • 隐式用户与显式用户
  • 对于线上的 API 必须保证所有接口正常且关闭所有的错误信息 => error_reporting(0),在输出JSON 时,不能有任何其它输出,否则,客户端将解析数据失败,app直接闪退

相关资料

API接口开发过程中的注意事项

APP接口版本兼容的问题
APP版本强制升级
APP升级二三事:APP升级场景及功能设计总结
App后端API设计版本问题

PHP / Laravel API 开发推荐阅读清单 有写关于Laravel的资料比较久

Laravel 的两个包 dingo/API nwidart/Laravel-modules 包使用的疑虑?

最近一个项目用 Laravel-5.6 匆匆的上了 其实 Laravel 也还不太熟
我想后面的项目也都用一个框架 然后项目以模块的方式开发 所以我就找了一个分模块的包 nwidart/laravel-modules

这个包最后模块也可以打成 composer 包 这样在项目的模块在开发的时候可以各负责自己的 更新的时候回也可以不用全量更新 那个模块更新就 composer 那个就行.

而接口我需要分版本 v1 v2 这样的 所以就找了这个包dingo/api 看一些评论说Transformers这个挺好用的 还没尝尝呢…

因为当时也在催着 急急忙忙就把项目上了 现在想优化下东西就感觉有点麻烦 程序目前也比较简单 我想把这两个撤掉还是继续研究这个两个包和 Laravel 的关系呢?

相关

v2ex-讨论
laravel-讨论

laravel-passport

  • laravel-5.6
  • laravel/passport ^7.0

laravel+用户认证+passport

laravel-用户认证

部署配置完后-验证结果

打开Postman或者类似的工具

方法为POST

链接为http://你的域名/oauth/token,(假如你使用了URI的前辍,则要在你的URI前加上你自定义的那个前辍)

在表单数据中添加以下项

key value
client_id 这里使用的是生成密钥里的clientid值
client_secret 这个是上面ID对应的secret
username users表里用于登录的用户名,默认为邮箱,除非你修改过默认值
password 用户登录对应的密码
grant_type password(oauth2有多种类型,我这里使用密码验证类型测试)

tip: 其中username password 是先通过生成认证系统后然后注册的用户邮箱+密码

相关资料

官方文档-Passport
中文文档-Passport OAuth 认证

Laravel Passport API 认证使用小结
在laravel中配置及测试passport
Laravel5.5+passport 放弃 dingo 开发 API 实战,让 API 开发更省心
laravel passport包使用”客户端凭证方式”疑问

laravel-获取客户端IP

可以在控制器中获取, 那么如何在类中或自定义的函数中呢? 

laravel-5.6


控制器中获取

<?php
use Request; // 方式1 可以在自定义类中或函数中或取到IP
// use Illuminate\Http\Request; // 方式2
// use Symfony\Component\HttpFoundation\Request; // 方式3
....

    public function test(Request $request)
    {
        Request::ip(); // 方式1 可以静态获取

        //$request->getClientIps(); // 方式2、3 获取ip
        //$request->ip(); 

        //request()->ip(); // 方式4直接通过助手函数获取

    }
....

源码位置: /vendor/laravel/framework/src/Illuminate/Http/Request.php

laravel-内置函数-helpers

  • laravel-5.6

文件位置: /vendor/laravel/framework/src/Illuminate/Support/helpers.php

<?php

use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Support\Optional;
use Illuminate\Support\Collection;
use Illuminate\Support\Debug\Dumper;
use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Support\HigherOrderTapProxy;

if (! function_exists('append_config')) {
    /**
     * Assign high numeric IDs to a config item to force appending.
     *
     * @param  array  $array
     * @return array
     */
    function append_config(array $array)
    {
        $start = 9999;

        foreach ($array as $key => $value) {
            if (is_numeric($key)) {
                $start++;

                $array[$start] = Arr::pull($array, $key);
            }
        }

        return $array;
    }
}

......

laravel二维码生成

在 config/app.php 注册serviceProvider

SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class

在 config/app.php 添加Facades

'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class

在Controller中引入

use SimpleSoftwareIO\QrCode\Facades\QrCode;

直接生成图片

$str = QrCode::size(300)->generate('Make me into a QrCode!');

将图片转成base64编码

$qrcode = base64_encode(QrCode::format('png')->size(300)->generate($encode));

相关资料

composer-simple-qrcode
github-simple-qrcode
Laravel中使用Simple Qrcode生成二维码
Class ‘QrCode’ not found Or add 'use SimpleSoftwareIO\QrCode\Facades\QrCode; '. If you wish to call it from your controller.

laravel-mews/captcha-图形验证码

php-composer: composer require mews/captcha

Tip: 默认是session方式保存图形验证码值. 见 README.md

API方式调用

Route::get('captcha', function () {
    $res = app('captcha')->create('default', true);
    return $res; // 用JSON格式后输出, 不然有些字符会被转义. 
});

Route::post('check_captcha', function (Request $req) {
    $captcha = $req->input('captcha');
    $key = $req->input('key');
    $res = captcha_api_check($captcha, $key);
    dump($res);
});

app(‘captcha’)->create-代码位置

captcha-函数列表

相关资料

Validate capatcha in api middleware 支持API方式图形验证码
mews/captcha 图片验证码

Laravel路由是如何实现的原理是什么

项目中使用了laravel-modules|dingo-api 在模块下的Request规则中无法使用. 怀疑和路由有关.

了解其路由原理后, 单独建立一个路由文件. 是否可以和项目自带的路由文件一样的功能.

Laravel是如何知道加载哪个路由文件?

Route::group() ‘prefix’ => ‘ksapi’, 中设置的前缀生效, $api->group() 中设置的前缀不生效.

开始查找为什么设置prefix不生效?

文件: vendor/dingo/api/src/Routing/Router.php var_dump($attributes['prefix']);
输出内容

string(3) "api"
string(9) "api/ksapi"

发现原来URL上还有加到api 之前的URL:http://{{host}}/ksapi/version 修改后URL:http://{{host}}/api/ksapi/version

现在请求验证正常, 随带把之前的版本访问问题也解决了, 但是api/ksapi, 如何可以只用ksapi就行?

相关资料

深入浅出 Laravel 路由执行原理