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,你需要根据实际情况填写。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐