-
C언어: 간단한 REST api 웹 서버 만들어보기컴퓨터/C & C++ 2021. 3. 9. 16:57728x90반응형
Kore
1. 소개
Kore는 C언어로 사용할 수 있는 웹 프레임워크이다. (Python 버전도 있음)
아래 웹 프레임워크 벤치마크에 따르면 35위로 되어있는데 (Go언어 gin은 48위)
concurreny 256, 512 기준은 activej 아래인 2위일 정도로 역시 C언어 속도는 대단한 것 같다.10위권도 못 들 정도로 역시 REST api로 쓰기엔 적합하진 않다
시스템 프로그래밍 언어이지만, 빠른 속도를 이용하여
RESTapi 웹 서버를 만들어 보고 싶었다.2. 설치
git clone https://github.com/jorisvink/kore cd kore make make install
3. 카카오 챗봇 SimpleText POST 예제
create으로 쉽게 boilerplate 파일을 만들 수 있다.
build 후 run 하면 서버가 실행된다. (conf/server.conf 에서 ip, port 수정)
end point들도 conf/server.conf에서 수정할 수 있다.
kodev create hello_world cd hello_world kodev build kodev run
server.c
JSON을 쓰는 게 까다로울 수 있다.
그래서 CPython API를 사용하면 조금 더 편하게 쓸 수 있을 것 같다.
#include <kore/kore.h> #include <kore/http.h> #include <string.h> struct kore_json_item *build_simple_text(char *msg); char *get_json_data(struct kore_json_item *json, char *keyword); int page(struct http_request *); int page(struct http_request *req) { struct kore_buf buf; // struct kore_json request; struct kore_json_item *json; kore_buf_init(&buf, 1024); /* Request JSON 받아올 때 */ // kore_json_init(&request, req->http_body->data, req->http_body->length); // if (!kore_json_parse(&request)) // { // kore_buf_appendf(&buf, "%s\n", kore_json_strerror(&request)); // 200, Error SimpleText // http_response(req, 200, NULL, 0); // return (KORE_RESULT_OK); // } // utter = get_json_data(&request, "userRequest/utterance"); // 유저 발화문 // kore_buf_appendf(&buf, "utterance = '%s'\n", utter); /* Request JSON 받아올 때 */ json = build_simple_text("First SimpleText!"); kore_json_item_tobuf(json, &buf); char *answer = kore_buf_stringify(&buf, NULL); // 항상 JSON response http_response_header(req, "Content-Type", "application/json; charset=utf-8"); http_response(req, 200, answer, strlen(answer)); // http_response(req, 200, buf.data, buf.offset); kore_buf_cleanup(&buf); kore_json_item_free(json); // kore_json_cleanup(&request); return (KORE_RESULT_OK); }
json_model.c
#include <kore/kore.h> #include <kore/http.h> #include <string.h> #include <stdio.h> extern struct kore_json_item *build_simple_text(char *msg) { struct kore_json_item *json; struct kore_json_item *template; struct kore_json_item *outputs; struct kore_json_item *simpleTextOuter; struct kore_json_item *simpleText; struct kore_json_item *text; json = kore_json_create_object(NULL, NULL); template = kore_json_create_object(json, "template"); outputs = kore_json_create_array(template, "outputs"); simpleTextOuter = kore_json_create_object(outputs, NULL); simpleText = kore_json_create_object(simpleTextOuter, "simpleText"); text = kore_json_create_object(simpleText, NULL); kore_json_create_string(text, "text", msg); // 마지막으로 text 만들기 kore_json_create_string(json, "version", "2.0"); return json; } extern char *get_json_data(struct kore_json *json, char *keyword) { struct kore_json_item *find = kore_json_find_string(json->root, keyword); if (find != NULL) { return find->data.string; } else { fprintf(stderr, "Could not find %s\n", keyword); return NULL; } }
POST 결과
more
struct kore_json_item *build_button(char *label, char *action, char *webLinkUrl) { struct kore_json_item *button; button = kore_json_create_object(NULL, NULL); kore_json_create_string(button, "label", label); kore_json_create_string(button, "action", action); kore_json_create_string(button, "webLinkUrl", webLinkUrl); return button; } struct kore_json_item *build_quick_reply(char *messageText, char *action, char *label) { struct kore_json_item *quickReply; struct kore_json_item *messageTextNode; struct kore_json_item *actionNode; struct kore_json_item *labelNode; quickReply = kore_json_create_object(NULL, NULL); messageTextNode = kore_json_create_object(quickReply, "messageText"); kore_json_create_string(messageTextNode, "text", messageText); actionNode = kore_json_create_object(quickReply, "action"); kore_json_create_string(actionNode, "text", action); labelNode = kore_json_create_object(quickReply, "label"); kore_json_create_string(labelNode, "text", label); return quickReply; }
728x90'컴퓨터 > C & C++' 카테고리의 다른 글
Cosmopolitan: Python, C 언어 크로스 플랫폼 사용 (0) 2022.08.23 C언어: url HTML 가져오기 (C에서 Python 사용하기) (0) 2021.03.08 C++ Insertion Sort 및 성능 테스트 (0) 2020.10.05