libevent详解四(http服务)

创建基于libevent的http服务

先上代码。

#include "event2/http.h"
#include "event2/http_struct.h"
#include "event2/event.h"
#include "event2/buffer.h"
#include "event2/buffer_compat.h"
#include <stdlib.h>
#include <stdio.h>

void callback_s(struct evhttp_request* request, void* arg)
{
	//从request对象获取请求的uri对象
    const struct evhttp_uri* evhttp_uri = evhttp_request_get_evhttp_uri(request);

	//获取post数据
	char *post_data = (char *)EVBUFFER_DATA(request->input_buffer);

	//获取path
	const char *path = evhttp_uri_get_path(evhttp_uri);
	
	//获取get参数
	const char *query = evhttp_uri_get_query(evhttp_uri);

	printf("path:%s\n",path);
	printf("query:%s\n",query);
	printf("post data:%s\n",post_data);

    struct evbuffer* evbuf = evbuffer_new();
    evbuffer_add_printf(evbuf, "path is [%s] and post_body = [%s]\n",path , post_data);
    evhttp_send_reply(request, HTTP_OK, "OK", evbuf);
    evbuffer_free(evbuf);
}

void callback_gen(struct evhttp_request* request, void* arg)
{
    const struct evhttp_uri* evhttp_uri = evhttp_request_get_evhttp_uri(request);

	//获取url,即/path/path1/path2?arg1=tt&arg2=tt
    char url[2020];
    evhttp_uri_join(const_cast<struct evhttp_uri*>(evhttp_uri), url, 2020);
	char *post_data = (char *)EVBUFFER_DATA(request->input_buffer);

    printf("url:%s\n", url);
	printf("path:%s\n",evhttp_uri_get_path(evhttp_uri));
	printf("query:%s\n",evhttp_uri_get_query(evhttp_uri));
	printf("post data:%s\n",post_data);

    struct evbuffer* evbuf = evbuffer_new();
    evbuffer_add_printf(evbuf, "url is [%s] and post_body = [%s]\n", url, post_data);
    evhttp_send_reply(request, HTTP_OK, "OK", evbuf);
    evbuffer_free(evbuf);
}

int main(int argc, char** argv)
{
    int port = atoi(argv[1]);
    struct event_base* base = event_base_new();

    struct evhttp* http = evhttp_new(base);
    evhttp_bind_socket(http, "0.0.0.0", port);

	//设置默认回调函数,如果对应路径找不到回调,则会使用默认回调
    evhttp_set_gencb(http, callback_gen, NULL);
	//设置某一路径的回调函数,即请求的时候,若path="/this",则会走callback_s这个回调函数
	evhttp_set_cb(http,"/this",callback_s, NULL);

    event_base_dispatch(base);
    return 0;
}

http路径对应的回调函数.

通过函数evhttp_set_cb,来设置某个路径的回调函数。
通过evhttp_set_gencb,设置默认回调函数。

如上例子:
请求"http://localhost:post/this?type1"时,路径为/this,即会使用回调函数callback_s, 其他路径,会使用回调函数callback_gen

各个路径对应的回调函数,是存放在链表中(evhttp::callbacks),所以若设置的太多,响应会变慢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章