4.1. SOCGI开发规范

hetao提供了扩展开发接口,应用按socgi接口规范开发动态库,hetao启动时按配置加载,当接收到符合要求URI扩展名的请求时,调用动态库中的应用逻辑。

socgi接口规范分应用动态库入口函数、平台信息访问函数组成。

每个符合socgi入口函数的应用动态库必须实现三个约定原型的函数InitHttpApplication、CallHttpApplication和CleanHttpApplication,原型及代码模板如下:

  1. #include "hetao_socgi.h"
  2.  
  3. INITHTTPAPPLICATION InitHttpApplication ;
  4. int InitHttpApplication( struct HttpApplicationContext *ctx )
  5. {
  6. ...
  7.  
  8. return 0;
  9. }
  10.  
  11. CALLHTTPAPPLICATION CallHttpApplication ;
  12. int CallHttpApplication( struct HttpApplicationContext *ctx )
  13. {
  14. ...
  15.  
  16. return 0;
  17. }
  18.  
  19. CLEANHTTPAPPLICATION CleanHttpApplication ;
  20. int CleanHttpApplication( struct HttpApplicationContext *ctx )
  21. {
  22. ...
  23.  
  24. return 0;
  25. }

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。

  1. #include "hetao_socgi.h"
  2. #include "LOGC.h"
  3.  
  4. INITHTTPAPPLICATION InitHttpApplication ;
  5. int InitHttpApplication( struct HttpApplicationContext *ctx )
  6. {
  7. InfoLog( __FILE__ , __LINE__ , "InitHttpApplication" );
  8.  
  9. return 0;
  10. }
  11.  
  12. CALLHTTPAPPLICATION CallHttpApplication ;
  13. int CallHttpApplication( struct HttpApplicationContext *ctx )
  14. {
  15. char http_body[ 1024 ] ;
  16. int http_body_len ;
  17.  
  18. int nret = 0 ;
  19.  
  20. InfoLog( __FILE__ , __LINE__ , "InitHttpApplication" );
  21.  
  22. /* 填充HTTP响应报文 */
  23. memset( http_body , 0x00 , sizeof(http_body) );
  24. http_body_len = SNPRINTF( http_body , sizeof(http_body)-1 , "hetao_socgi : hello world\n" ) ;
  25. nret = SOCGIFormatHttpResponse( ctx , http_body , http_body_len , NULL ) ;
  26. if( nret )
  27. {
  28. ErrorLog( __FILE__ , __LINE__ , "SOCGIFormatHttpResponse failed[%d]" , nret );
  29. return nret;
  30. }
  31. else
  32. {
  33. InfoLog( __FILE__ , __LINE__ , "SOCGIFormatHttpResponse ok" );
  34. return 0;
  35. }
  36. }
  37.  
  38. CLEANHTTPAPPLICATION CleanHttpApplication ;
  39. int CleanHttpApplication( struct HttpApplicationContext *ctx )
  40. {
  41. InfoLog( __FILE__ , __LINE__ , "CleanHttpApplication" );
  42.  
  43. return 0;
  44. }

示例中复用了hetao的日志库,应包含头文件LOGC.h。

SOCGIFormatHttpResponse为组织HTTP响应报文。hetao_socgi.h里还有其它函数接口给与应用使用,函数SOCGIGetHttpEnv得到HTTP应用上下文中的HTTP对象,应用可以通过hetao的HTTP解析库fasterhttp访问HTTP数据,SOCGISetUserData和SOCGIGetUserData用于设置和获取应用自定义数据,用于三入口之间传递信息。