# HTTP 服务器

最先开始的时候,我们说了 炸毛框架 不仅仅是聊天机器人的框架,还是一个完整的 HTTP + WebSocket 服务器,你不仅可以开发机器人功能,框架还可用于开发任何 Web 应用程序,构建高性能的 Web 系统、API、中间件、基础服务等。

提示

炸毛框架的注解和 HTTP 服务器控制器响应方式高度类似 Swoft 框架,如果你熟悉 Swoft 框架的话,这里学习起来将会非常容易。

# 功能特色

  • 基于 @RequestMapping@Controller 的路由注解
  • 提供简单的参数支持
  • 响应迅速,无任何臃肿的框架代码,无过多封装,直接操作原生的 Swoole 对象

在一般情况下,我们启动了炸毛框架后,HTTP 服务器就自动启动了,访问框架监听的地址和端口,就可以访问 HTTP 服务。

# 控制器和路由

控制器主要通过 @Controller 注解实现。此注解仅适用于对类进行修饰。

  • 名称:@Controller

  • 命名空间:ZM\Annotation\Http\Controller

  • 参数:*prefix

  • 作用:声明此类下所有路由的根路由地址。

  • 名称:@RequestMapping

  • 命名空间:ZM\Annotation\Http\RequestMapping

  • 参数:*routenamemethod

  • 作用:路由地址

# 路由规则

通常情况,一个完整的路由 path 等于 @Controllerprefix + @RequestMappingroute。例如:

<?php
namespace Module\Example;

use ZM\Annotation\Http\Controller;
use ZM\Annotation\Http\RequestMapping;
/**
 * @Controller("/api")
 */
class Test {
    /**
     * @RequestMapping("/index")
     */
    public function index(){
        //context()->getResponse()->end("This is API index page");
        ctx()->getResponse()->end("This is API index page");
    }
  	/**
  	 * @RequestMapping("/ping")
  	 */
    public function ping(){
        ctx()->getResponse()->end("pong");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

以上编写后,从浏览器访问 http://127.0.0.1:20001/api/index 时就会访问到 This is API index page,访问 /api/ping 时就会返回 pong

提示

@Controller/ 的时候,效果和不写是一样的,@RequestMapping//index/inside 等多级路由也是可以的。

# 绑定参数

@RequestMapping 中,不仅可以写静态的路由地址,也可以写绑定的参数。例如:@RequestMapping(route="/index/{name}"),则访问 /index/xxx 的时候,你在函数方法内可以这样获取此参数:

public function index($arg) {
    ctx()->getResponse()->end("Your param 'name' is ".$arg["name"]);
}
1
2
3

# 设置路由请求方式

如果想要设置允许请求控制器的 HTTP 请求方式,可以使用方法在控制器中的 @RequestMapping 注解配置 method 参数,可以是 GETPOSTPUT, PATCHDELETEOPTIONSHEAD 中的一个或多个。

  • 限定 HTTP 方法:@RequestMapping(method="GET")@RequestMapping(method={"GET","POST"})

# 事件可用的基类变量

提示

对于 Request HTTP 请求事件,在函数内还可以使用 context()->getRequest()context()->getResponse() 来获取上述对象。

# 中间件

对于 @RequestMapping 方法,还支持中间件,完成 Session 会话、认证等功能。中间件是用于控制 请求到达响应请求 的整个流程的。从一定意义上来说相当于切面编程(AOP)。目前该中间件仅支持 @RequestMapping 绑定的路由函数。

提示

从 1.3.0 版本开始,框架的任何事件类注解绑定均支持中间件的绑定了,而且还支持多个中间件的绑定,此部分原先内容已迁移到 中间件注解 部分。

# HTTP 客户端

框架内依赖了 Swoole 官方推荐的 Saber,可直接在任意位置使用。这里是 Saber 地址 (opens new window)

对于 GET 请求 和 POST 请求,框架内也封装了轻量的函数调用,如果使用 file_get_contents 类和 curl_exec 之类的网络请求函数,在 1.1 版本之后开启了 一键协程化 (opens new window),也可以正常使用。Saber 和框架内的轻量化函数都是协程优化的,也都可以正常使用。

框架内的轻量函数见组件中 ZMRequest 组件

# 静态文件服务器

1.1.2 版本开始,框架支持了静态文件的访问。如需使用,则需要先到配置文件中配置相应的 static_file_server 参数,这里是 配置文件

设置完成后,访问框架的地址,加上文件名,例如在默认路径下自带的 resources/html/static.html 文件,通过访问 http://127.0.0.1:20001/static.html 就可以访问了。

你可以将前后端分离的前端部分放入这里进行分发和部署。

# 局部静态文件服务

此功能 1.4 版本开始可用。

上面的静态文件服务器为全局的,如果你只需要在一个路由下使用静态文件服务,则按照如下例子即可。

注意要先 use ZM\Http\StaticFileHandler;

/**
 * @RequestMapping("/images/{filename}")
 * @param $param
 * @return StaticFileHandler
 */
public function staticImage($param) {
  Console::info("[lexicon] " . $param["filename"]);
  return new StaticFileHandler($param["filename"], "/path/to/your/images/");
}
1
2
3
4
5
6
7
8
9

上面假设你在 /path/to/your/images/ 这个目录下有大量的图片,比如你有 a.jpg,浏览器访问:http://框架地址:端口/images/a.jpg 就可以获取图片了。

上次更新: 5/23/2020, 5:30:02 PM