创建基于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),所以若设置的太多,响应会变慢。