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