본문 바로가기
프로그래밍/C++ rest(Casablanca)

C++] cpprestSDK(Casablanca) 1. http_listener 에 대해서....

by Hwan2 2020. 7. 2.
728x90
반응형

http_listener는 task기반으로 만들어진 pplx::로 만들어졌습니다.

따라서 해당 객체를 open() 으로 실행하게 되면 쓰레드가 생성되면서 비동기적으로 실행됩니다.

또한 boost의 asio를 사용하여 만들어졌기 때문에 운영체제마다 제공하는 Thread pool을 사용하며,

사용자는 Thread에 대해 관리를 해주지 않아도 됩니다.

또한 내부적으로 중복생성을 막기위한 코드가 존재하며 예외처리를 합니다.

사용자는 support() 함수를 이용해 코드를 간편하게 만들면 됩니다.


1. http_listener 사용법

해당 클래스는 namespace web::http::experimental::listener 에 정의되어 있습니다.

따라서 사용하기 편하게 하실려면 using namespace web::http::experimental::listener; 를 선언해주세요.


해당 http_listener는 다음과 같이 정의되어 있습니다.


 http_listener ()

 http_listener 객체 생성(기본 생성자)

 http_listener (http::uri address)

 http_listener 객체 생성(uri address주소 입력)

 http_listener (http::uri address, http_listener_config config)

 http_listener 객체 생성(uri address주소, listener설정 객체)

 ~http_listener ()

 http_listener 소멸자

 open() -> return pplx::task< void >

 소켓 open, ppls::task객체 반환 (비동기)

 close() -> pplx::task< void >

 소켓 close, ppls::task객체 반환 (비동기)

 support (const std::function< void(http_request)> &handler)

 핸들러 함수(모든 핸들러 호출)

 support (const http::method &method,                                      const std::function<void(http_request)> &handler)

 핸들러 함수(특정 요청에 대한 핸들러 호출)

 uri () const -> return const http::uri & 

 해당 http_listner에 대한 http::uri 객체 반환

 configuration () const -> return const http_listener_config & 

 해당 http_listtner에 대한 config 객체 반환

 http_listener (http_listener &&other)

 move 생성자 지원

 operator= (http_listener &&other) -> return http_listener & 

 연산자 캐스팅으로 인해 = 호출시 move



http_listener_config는 다음과 같이 정의되어 있습니다.


 http_listener_config ()

 디폴트 값으로 셋팅(timeout 값 120초로 설정)

 timeout () const -> return utility::seconds 

 설정된 시간에 대한 utility::seconds 객체 반환

 set_timeout (utility::seconds timeout)

 timeout 시간 설정

 get_ssl_context_callback () const

 ssl 콜백 함수로 여기선 다루지 않겠음.



http_listener.hhttps://microsoft.github.io/cpprestsdk/http__listener_8h_source.html


http_listener referencehttps://microsoft.github.io/cpprestsdk/classweb_1_1http_1_1experimental_1_1listener_1_1http__listener.html


http_listener_config referencehttps://microsoft.github.io/cpprestsdk/classweb_1_1http_1_1experimental_1_1listener_1_1http__listener__config.html


uri referencehttps://microsoft.github.io/cpprestsdk/classweb_1_1uri.html


2. http_listtner 예시


#include <iostream>
#include <cpprest/http_listener.h>
#include <cpprest/json.h>

using namespace web;
using namespace web::http;
using namespace web::http::experimental::listener;

int main(){
    http_listener_config listen_config;     //설정값 선언(디폴트 120초 타임아웃)
    listen_config.set_timeout(utility::seconds(10));    //10초로 변경
    
//listener생성. Server URL, Port 지정, 설정값 전달.
    http_listener listener(U("http://0.0.0.0:10022"), listen_config);  

    listener.support(methods::GET, [&listener](http_request req){   //기본적인 GET 요청에 대한 명령어 정리.
        auto path = listener.uri().path();
        auto scheme = listener.uri().scheme();
        auto user_info = listener.uri().user_info();
        auto host = listener.uri().host();
        auto port = listener.uri().port();
        auto query = listener.uri().query();
        auto fragment = listener.uri().fragment();

        std::cout << "path : " << path << std::endl;
        std::cout << "scheme : " <<scheme << std::endl;
        std::cout << "user_info : " <<user_info << std::endl;
        std::cout << "host : " <<host << std::endl;
        std::cout << "port : " <<port << std::endl;
        std::cout << "query : " <<query << std::endl;
        std::cout << "fragment : " <<fragment << std::endl;

        req.reply(status_codes::OK, "hello word!\n");           
        });
    
    listener.open().then([&listener](){      //listener open.
        std::cout << (U("\n start!!\n"));
        }).wait();  //내부적으로 wait()를 해주지만 안해서 나쁜건 없다.!!
    while(true);
    listener.close();       //listener close.
    return 0;
    
}


결과.



※ 사진이 작게 나오니 클릭해서 보세요~


반응형

댓글


스킨편집 -> html 편집에서