4.1. SOCGI开发规范
hetao提供了扩展开发接口,应用按socgi接口规范开发动态库,hetao启动时按配置加载,当接收到符合要求URI扩展名的请求时,调用动态库中的应用逻辑。
socgi接口规范分应用动态库入口函数、平台信息访问函数组成。
每个符合socgi入口函数的应用动态库必须实现三个约定原型的函数InitHttpApplication、CallHttpApplication和CleanHttpApplication,原型及代码模板如下:
- #include "hetao_socgi.h"
- INITHTTPAPPLICATION InitHttpApplication ;
- int InitHttpApplication( struct HttpApplicationContext *ctx )
- {
- ...
- return 0;
- }
- CALLHTTPAPPLICATION CallHttpApplication ;
- int CallHttpApplication( struct HttpApplicationContext *ctx )
- {
- ...
- return 0;
- }
- CLEANHTTPAPPLICATION CleanHttpApplication ;
- int CleanHttpApplication( struct HttpApplicationContext *ctx )
- {
- ...
- return 0;
- }
InitHttpApplication在hetao启动时加载应用动态库后马上调用,一般加入初始化应用环境逻辑,比如连接数据库。CallHttpApplication在HTTP请求到来时符合URI扩展名时调用,可调用平台信息访问函数获得当前HTTP请求相关信息。CleanHttpApplication在hetao关闭时卸载应用动态库前调用,比如断开数据库。
hetao的socgi编程接口头文件是hetao_socgi.h,库文件是libhetao_socgi.so、libhetao_util.so, Windows库文件分别是hetao_socgi.[lib,dll]、hetao_util.[lib,dll]。
以下是一个示例,代码在test/test_socgi_hello/test_socgi_hello.c。
- #include "hetao_socgi.h"
- #include "LOGC.h"
- INITHTTPAPPLICATION InitHttpApplication ;
- int InitHttpApplication( struct HttpApplicationContext *ctx )
- {
- InfoLog( __FILE__ , __LINE__ , "InitHttpApplication" );
- return 0;
- }
- CALLHTTPAPPLICATION CallHttpApplication ;
- int CallHttpApplication( struct HttpApplicationContext *ctx )
- {
- char http_body[ 1024 ] ;
- int http_body_len ;
- int nret = 0 ;
- InfoLog( __FILE__ , __LINE__ , "InitHttpApplication" );
- /* 填充HTTP响应报文 */
- memset( http_body , 0x00 , sizeof(http_body) );
- http_body_len = SNPRINTF( http_body , sizeof(http_body)-1 , "hetao_socgi : hello world\n" ) ;
- nret = SOCGIFormatHttpResponse( ctx , http_body , http_body_len , NULL ) ;
- if( nret )
- {
- ErrorLog( __FILE__ , __LINE__ , "SOCGIFormatHttpResponse failed[%d]" , nret );
- return nret;
- }
- else
- {
- InfoLog( __FILE__ , __LINE__ , "SOCGIFormatHttpResponse ok" );
- return 0;
- }
- }
- CLEANHTTPAPPLICATION CleanHttpApplication ;
- int CleanHttpApplication( struct HttpApplicationContext *ctx )
- {
- InfoLog( __FILE__ , __LINE__ , "CleanHttpApplication" );
- return 0;
- }
示例中复用了hetao的日志库,应包含头文件LOGC.h。
SOCGIFormatHttpResponse为组织HTTP响应报文。hetao_socgi.h里还有其它函数接口给与应用使用,函数SOCGIGetHttpEnv得到HTTP应用上下文中的HTTP对象,应用可以通过hetao的HTTP解析库fasterhttp访问HTTP数据,SOCGISetUserData和SOCGIGetUserData用于设置和获取应用自定义数据,用于三入口之间传递信息。