Perfect介绍

Perfect提供一系列代表请求和响应的对象组件,并允许在服务器上增加管理句柄用于产生页面内容。 所有对象都是在服务器对象创建后开始工作。服务器对象会被执行配置,随后会根据配置绑定并监听特定端口。一旦出现连接,服务器会读取请求数据,请求数据读取完成后,服务器会将request object请求对象传递给请求过滤器。

请求过滤器

过滤器可能会根据需要修改查询请求。服务器会使用请求的URI路径检索routing请求/响应路由以获取处理该请求的具体句柄。如果找到了合适的处理句柄,服务器会传递给句柄对应的response object响应对象。当句柄反馈响应完成时,响应对象会被传递给响应过滤器。这些过滤器会根据需要修改最终输出的数据内容。最后响应结果数据会被推送给客户端浏览器,而客户端到服务器的连接或者被关闭、或者被拒绝维持HTTP持久连接、或者为后续请求和响应维持HTTP活动连接。

HTTP请求/响应路由

HTTP请求/响应路由是用于决定在当前请求下,哪一个句柄去接收和响应。

  1. 句柄:可以是一个函数、过程或者方法,只要能够接收特定类型的请求并做出反应即可。
  2. 路由:主要依据请求的方法HTTP request method和请求内容包括的路径信息来决定的。
1
2
3
4
routes.add(method: .post, uris: ["HostMonitor/client/log/addLog"]){
    (request,response) in
        //处理请求,并响应请求
    }
  1. URI路由变量 URI变量是用于处理动态请求的好方法。比如,一个包含用户id的URL可以用该方法实现相关请求的用户管理。 每个变量组件是通过一个程序块{ }声明的。在程序块中是变量名称。每个变量名称都可以使用出了括号}之外的任何字符。变量名有点像单功能通配符一样,这样就可以匹配任何符合变量模式的路径。 变量值:在匹配该模式下URL能够通过HTTPRequest.urlVariables字典查询变量值。该字典是[String:String]类型。

请求对象HTTPRequest

当处理一个HTTP请求时,所有客户端的互动操作都是通过HTTPRequest请求对象和HTTPResponse响应对象实现的。 HTTPRequest对象包含了客户端浏览器发过来的全部数据,包括请求消息头、查询参数、POST表单数据以及其它所有相关信息,比如客户IP地址和URL变量。

HTTPRequest对象将采用application/x-www-form-urlencoded编码格式对客户请求进行解析解码。而如果请求中采用multipart/form-data“多段”编码方式,则HTTP请求可以把各种未处理的原始格式表单传输过来。当处理“多段”表单数据时,HTTPRequest对象会为请求上传的文件自动创建临时目录并执行解码。这些文件会在请求过程中一直保持直到请求处理完毕,随后自动被删除。

以上涉及到的各种属性和函数都是HTTPRequest请求协议的部分内容。