利用C++写fastCGI接口
FastCGI 是快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。在工作中,我常常用到 FastCGI 写一些 HTTP 接口,但大多都是 GET 方法。前几天自己给微信企业号写了一个消息相应事件的接口中用到了POST方法,再网上找了一些教程,发
·
FastCGI 是快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。
在工作中,我常常用到 FastCGI 写一些 HTTP 接口,但大多都是 GET 方法。前几天自己给微信企业号写了一个消息相应事件的接口中用到了POST方法,再网上找了一些教程,发现都不太好用。于是向前辈哪里要了一套实现代码,自己感觉使用很方便。于是今天分享出来,如有不对的地方欢迎来喷。
FastCGI 版本
v 1.12
调用函数
*函数说明:获取请求参数
FCGX_GetParam()
函数说明:返回数据
FCGX_FPrintF ()
函数说明:监听HTTP事件
FCGX_Accept()
示例代码
#include <fcgi_stdio.h>
#include <fcgiapp.h>
using namespace std;
int main(int argc, char **argv)
{
FCGX_Stream *in, *out, *err;
FCGX_ParamArray evnp;
while(FCGX_Accept(&in, &out, &err, &evnp) >= 0)
{
string query;
do
{
char *pRequestMoethod = FCGX_GetParam("REQUEST_METHOD", evnp);
if(pRequestMoethod == NULL)
{
cout << "ERROR: getevn REQUEST_METHOD is failed." << endl;
break;
}
//判断请求方法
if(strcmp(pRequestMoethod, "POST") == 0)
{
//获取请求中URL携带的参数,POST也会在URL中携带参数
query = FCGX_GetParam("QUERY_STRING", evnp);
//获取POST请求携带的参数长度
char *pLenstr = FCGX_GetParam("CONTENT_LENGTH", evnp);
if(pLenstr != NULL)
{
long len = atoi(pLenstr);
string postData;
//获取POST携带的数据
for(int i = 0; i < (int)len; i++)
{
int ch = FCGX_GetChar(in);
if(ch < 0)
{
break;
}
postData += (char)ch;
}
//处理请求,具体逻辑忽略
processRequest(query, postData);
}
else
{
cout << "getenv failed." << endl;
}
}
else if(strcmp(pRequestMoethod, "GET") == 0)
{
//获取请求中URL携带的参数
query = FCGX_GetParam("QUERY_STRING", evnp);
//处理GET请求,代码隐藏
processRequest(query);
break;
}
else
{
cout << "This is unknown quest." << endl;
}
}
while(false);
string reply;
reply = getReply(); //获取返回数据
//向客户端返回用到数据
FCGX_FPrintF(out, "Content-type: text/xml;\r\n"
"Content-Length: %d\r\n"
"\r\n"
"%s",reply.length(), reply.c_str());
}
return 0;
}
代码说明
以上代码中关键位置都有备注,就不一一讲解了。这里只说几个重点,FCGX_FPrintF 函数向客户端返回一个字符串,其中内容就是HTTP请求响应结果,这里需要注意 Content-type,你需要根据实际情况填写。
更多推荐
已为社区贡献1条内容
所有评论(0)