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),所以若設置的太多,響應會變慢。

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