API 结构

为了提供一个统一API的实现方式和使用方式,将会做出一系列实现和使用的规范

身份验证

API 使用基于令牌的身份验证机制。某些终端不需要身份验证。您可以通过 /api/token 取得一个令牌,主要有两种令牌:

  • 密码授权令牌
  • 私人访问令牌

一般情况,后台管理程序推荐使用密码授权令牌。

基本结构

  • Notadd 中实现 API 路由的方式,倾向于传统 Laravel 的实现方式,基于 Controller 调用 API Handler 的方式来实现。
  • Handler 中使用 toResponse 方法返回 ApiResponse 的实例。
  • Handler 主要实现 DataHandler、SetHandler 两种类型的 Handler。
  • ApiResponse 为 \Psr\Http\Message\ResponseInterface 契约的一个实现。
  • ApiResponse 实例所提供的并返回至前端调用的数据主要包含:code、data、message。

所支持的相关API操作

  • /oauth/access 验证是否拥有 API 访问 Token
  • /oauth/access/authorize
  • /oauth/access/token
  • /oauth/authorize
  • /oauth/clients
  • /oauth/refresh

API Handler 示例

  1. namespace Notadd\Foundation\Setting\Controllers;
  2. use Notadd\Foundation\Routing\Abstracts\Controller;
  3. use Notadd\Foundation\Setting\Contracts\SettingsRepository;
  4. use Notadd\Foundation\Setting\Handlers\AllHandler;
  5. use Notadd\Foundation\Setting\Handlers\SetHandler;
  6. /**
  7. * Class ApiController.
  8. */
  9. class SettingController extends Controller
  10. {
  11. /**
  12. * @var \Notadd\Foundation\Setting\Contracts\SettingsRepository
  13. */
  14. protected $settings;
  15. /**
  16. * SettingController constructor.
  17. *
  18. * @param \Notadd\Foundation\Setting\Contracts\SettingsRepository $settings
  19. *
  20. * @throws \Illuminate\Contracts\Container\BindingResolutionException
  21. */
  22. public function __construct(SettingsRepository $settings)
  23. {
  24. parent::__construct();
  25. $this->settings = $settings;
  26. }
  27. /**
  28. * TODO: Method Description
  29. *
  30. * @param \Notadd\Foundation\Setting\Handlers\AllHandler $handler
  31. *
  32. * @return \Notadd\Foundation\Routing\Responses\ApiResponse
  33. * @throws \Exception
  34. */
  35. public function all(AllHandler $handler)
  36. {
  37. $response = $handler->toResponse();
  38. return $response->generateHttpResponse();
  39. }
  40. /**
  41. * @param \Notadd\Foundation\Setting\Handlers\SetHandler $handler
  42. *
  43. * @return \Notadd\Foundation\Routing\Responses\ApiResponse
  44. * @throws \Exception
  45. */
  46. public function set(SetHandler $handler)
  47. {
  48. $response = $handler->toResponse();
  49. return $response->generateHttpResponse();
  50. }
  51. }
  1. namespace Notadd\Foundation\Setting\Handlers;
  2. use Illuminate\Container\Container;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Translation\Translator;
  5. use Notadd\Foundation\Passport\Abstracts\DataHandler;
  6. use Notadd\Foundation\Setting\Contracts\SettingsRepository;
  7. /**
  8. * Class SettingHandler.
  9. */
  10. class AllHandler extends DataHandler
  11. {
  12. /**
  13. * @var \Notadd\Foundation\Setting\Contracts\SettingsRepository
  14. */
  15. protected $settings;
  16. /**
  17. * AllHandler constructor.
  18. *
  19. * @param \Illuminate\Container\Container $container
  20. * @param \Illuminate\Http\Request $request
  21. * @param \Notadd\Foundation\Setting\Contracts\SettingsRepository $settings
  22. * @param \Illuminate\Translation\Translator $translator
  23. */
  24. public function __construct(
  25. Container $container,
  26. Request $request,
  27. SettingsRepository $settings,
  28. Translator $translator
  29. ) {
  30. parent::__construct($container, $request, $translator);
  31. $this->settings = $settings;
  32. }
  33. /**
  34. * Http code.
  35. *
  36. * @return int
  37. */
  38. public function code()
  39. {
  40. return 200;
  41. }
  42. /**
  43. * Data for handler.
  44. *
  45. * @return array
  46. */
  47. public function data()
  48. {
  49. return $this->settings->all()->toArray();
  50. }
  51. /**
  52. * Errors for handler.
  53. *
  54. * @return array
  55. */
  56. public function errors()
  57. {
  58. return [
  59. '获取全局设置失败!',
  60. ];
  61. }
  62. /**
  63. * Messages for handler.
  64. *
  65. * @return array
  66. */
  67. public function messages()
  68. {
  69. return [
  70. '获取全局设置成功!',
  71. ];
  72. }
  73. }
  1. namespace Notadd\Foundation\Setting\Handlers;
  2. use Illuminate\Container\Container;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Translation\Translator;
  5. use Notadd\Foundation\Passport\Abstracts\SetHandler as AbstractSetHandler;
  6. use Notadd\Foundation\Setting\Contracts\SettingsRepository;
  7. /**
  8. * Class SetHandler.
  9. */
  10. class SetHandler extends AbstractSetHandler
  11. {
  12. /**
  13. * @var \Notadd\Foundation\Setting\Contracts\SettingsRepository
  14. */
  15. protected $settings;
  16. /**
  17. * SetHandler constructor.
  18. *
  19. * @param \Illuminate\Container\Container $container
  20. * @param \Illuminate\Http\Request $request
  21. * @param \Notadd\Foundation\Setting\Contracts\SettingsRepository $settings
  22. * @param \Illuminate\Translation\Translator $translator
  23. */
  24. public function __construct(
  25. Container $container,
  26. Request $request,
  27. SettingsRepository $settings,
  28. Translator $translator
  29. ) {
  30. parent::__construct($container, $request, $translator);
  31. $this->settings = $settings;
  32. }
  33. /**
  34. * Data for handler.
  35. *
  36. * @return array
  37. */
  38. public function data()
  39. {
  40. return $this->settings->all()->toArray();
  41. }
  42. /**
  43. * Errors for handler.
  44. *
  45. * @return array
  46. */
  47. public function errors()
  48. {
  49. return [
  50. '修改设置失败!',
  51. ];
  52. }
  53. /**
  54. * Execute Handler.
  55. *
  56. * @return bool
  57. */
  58. public function execute()
  59. {
  60. $this->settings->set('site.enabled', $this->request->input('enabled'));
  61. $this->settings->set('site.name', $this->request->input('name'));
  62. $this->settings->set('site.domain', $this->request->input('domain'));
  63. $this->settings->set('site.beian', $this->request->input('beian'));
  64. $this->settings->set('site.company', $this->request->input('company'));
  65. $this->settings->set('site.copyright', $this->request->input('copyright'));
  66. $this->settings->set('site.statistics', $this->request->input('statistics'));
  67. return true;
  68. }
  69. /**
  70. * Messages for handler.
  71. *
  72. * @return array
  73. */
  74. public function messages()
  75. {
  76. return [
  77. '修改设置成功!',
  78. ];
  79. }
  80. }

模块类 API 文档