programing

c++ 언어 및 JSON 파서를 사용하여 Restful Web Services를 작성하는 방법

oldcodes 2023. 3. 20. 23:34
반응형

c++ 언어 및 JSON 파서를 사용하여 Restful Web Services를 작성하는 방법

임베디드 Linux에서 작업하고 있는데 Linux 커스텀 보드에서 Restful 웹 서비스를 실행하고 싶습니다.

웹 서버(httpd 서버)와의 데이터 송수신(JSON 형식)이 목적입니다.

또한 그 Restful Web 서비스를 C++ 언어로 만들고 싶습니다.

Linux 커스텀 보드의 Restful Web Services의 필요성에 대해서는, 이하를 참조해 주세요.

  1. 먼저 JSON 포맷 데이터가 포함된 HTTP 요청을 Linux 보드에서 실행 중인 httpd 서버를 통해 보냅니다.

  2. 그런 다음 이 Restful Web Services를 c++ 언어로 구현하는 바이너리 또는 서버를 하나 만들고 HTTP 요청을 처리하기 위해 사용합니다.

  3. 그런 다음 이 C++ 바이너리는 웹 브라우저를 통해 표시 목적으로 응답을 httpd 서버로 반환합니다.

C++ 언어를 사용하여 Restful Web Services를 작성하는 방법이나 예를 알고 계신 분 계십니까?

Restful에 대한 어떤 도움도 환영합니다.

나의 Restful Web Services를 만족시키는 ffead와 그 기능에 대해 아는 사람이 있습니까?

레스트베드는 JSON 파서를 제외하고 요건에 대응할 수 있습니다.단, 솔루션을 이미 이용 가능한 많은 C++ JSON 구현 중 하나와 조합하는 작업은 거의 필요하지 않습니다.

#include <memory>
#include <string>
#include <cstdlib>
#include <sstream>
#include <jsonbox.h>
#include <restbed>

using namespace std;
using namespace restbed;

void get_method_handler( const shared_ptr< Session > session )
{
    const auto request = session->get_request( );

    size_t content_length = request->get_header( "Content-Length", 0 );

    session->fetch( content_length, [ ]( const shared_ptr< Session >& session, const Bytes& body )
    {
        JsonBox::Value json;
        json.loadFromString( string( body.begin( ), body.end( ) ) );

        //perform awesome solutions logic...

        stringstream stream;
        json.writeToStream( stream );
        string response_body = stream.str( );

        session->close( OK, response_body, { { "Content-Length", ::to_string( response_body.length( ) }, { "Content-Type": "application/json" } } );
    } );
}

int main( const int, const char** )
{
    auto resource = make_shared< Resource >( );
    resource->set_path( "/resource" );
    resource->set_method_handler( "GET", get_method_handler );

    auto settings = make_shared< Settings >( );
    settings->set_port( 1984 );
    settings->set_default_header( "Connection", "close" );

    Service service;
    service.publish( resource );
    service.start( settings );

    return EXIT_SUCCESS;
}

대체 RESTful 프레임워크

대체 JSON 프레임워크

늦은 건 알지만, 1~2년 전에 새로운 일이 생겼어요.

고성능을 위한 하드코어 비동기 프로그래밍을 원하는 경우 boost::beast를 고려할 수 있습니다.이것은 boost::asio(일반적인 tcp/udp 및 i/o 라이브러리) 의 계층으로, http와 websocket 서버/클라이언트를 모두 갖추고 있습니다.

퍼포먼스와 멀티스레딩의 완전한 자유도에 최적입니다(서버를 사용할 수 있는 경우 거의 완벽한 캐싱을 통해 문자 그대로 수천 개의 스레드 상에서 서버를 실행할 수 있습니다).그러나, 학습의 폭이 매우 넓다는 점에 주의해 주세요.모든 것을 완벽하게 제어해야 할 경우에만 이 작업을 수행하십시오.

nlohmann JSON과 함께 oatpp를 사용하고 있습니다.순순히 빠져나갈지 몰라도oatppJSON 핸들링 기능이 내장되어 있기 때문입니다.단계별 가이드를 참조하십시오.

Apache2 또는 Nginx를 웹 서버로 사용하고 있으며 여기에 RESTful JSON 웹 서비스를 배포하려면 ngrest를 시도하십시오.사용하기 쉽고 빠릅니다.

C++ ngrest에서 JSON을 표현하려면 표준 C++ 유형(일반 유형, C++ 구조체, typedef, STL 컨테이너 등)을 사용합니다.raw JSON에도 액세스 할 수 있습니다.옵션으로 ngrest-db 확장을 사용하여 DBMS에 액세스할 수 있습니다.

C++ 서비스를 작성하는 일반적인 워크플로우의 예를 다음에 나타냅니다.

1) 서비스를 만듭니다(h/cpp 또는 단일 hpp 파일로 구현할 수 있습니다).

ngrest create -d hpp Users

2) "Edit" (편집)users/users/src/Users.hpp다음과 같이 합니다.

// a structure to represent data in JSON
struct User {
    int id;
    std::string name;
    std::string email;
};

// *location: /users
class Users: public ngrest::Service
{
public:
    // *method: POST
    int add(const User& user) {
        return Db::inst().users().insert(user).lastInsertId();
    }

    // *location: /{id}
    User get(int id) {
        return Db::inst().users().selectOne("id = ?", id);
    }

    // *method: DELETE
    void remove(int id) {
        Db::inst().users().deleteWhere("id = ?", id);
    }
};

3) 테스트를 위해 서비스를 실행합니다.

cd users
ngrest

4) 서비스 테스터를 사용하여 RESTful 웹 서비스를 테스트합니다.http://localhost: 9098/ngrest/service/users

5) ngrest를 실행하는 웹 서버에 웹 서비스 라이브러리를 배포합니다.

RESTful 서비스 클라이언트를 구축하는 경우 Casablanca(Microsoft가 관리하며 RESTful API에 액세스하기 위한 크로스 플랫폼 솔루션) https://github.com/Microsoft/cpprestsdk 등의 라이브러리를 고려해야 합니다.

또는 libcurl https://curl.haxx.se/libcurl 를 사용할 수도 있습니다.

컬을 위한 C++ 바인딩이 있습니다.사용하시는 보드에 따라 libcurl이 이미 설치되어 있을 수 있습니다.C++ 바인딩을 사용하면 됩니다.

두 라이브러리 모두 http/https를 처리합니다.libcurl은 json 파서를 제공하지 않지만 사용 가능한 C++ json 파서와 쉽게 결합할 수 있습니다.Casablanca는 완전하고 비동기식 모델을 기반으로 구축되었습니다.그러나 Boost 라이브러리에 의존합니다.그럼에도 불구하고 저는 인텔 에디슨 보드에서 성공적으로 사용해 왔습니다.

JSON 포맷으로 데이터를 송수신하려면 jsoncpp를 사용해 보십시오.

Mongoose, CivetWeb, NXWeb 등의 임베디드 웹 서버를 사용합니다.(자세한 것은, 투고를 참조해 주세요.)

일반적으로 응용 프로그램에 포함시키는 것은 간단하며 웹 서버 루트 핸들러에서 JSON 데이터를 해석/작성하기 위해 필요한 것은 JSON 라이브러리뿐입니다.REST는 결국 HTTP 요구일 뿐이므로 위의 중 하나를 사용하여 구현하기 쉽습니다.

아마도 Fast CGI를 사용하여 웹 서버와 인터페이스할 모듈을 만드는 것이 가장 좋습니다.이것에 의해, 독자적인 HTTP 서버를 실장할 필요가 없어집니다.

CppCMS와 같은 프레임워크가 자체 HTTP 서버를 내장하고 있기 때문에 Apache httpd만큼 무거운 것은 필요하지 않을 수 있습니다.

REST 서비스는 큰 부하가 걸리지 않을 것으로 생각합니다.

또한 CppCMS는 즉시 JSON을 지원합니다.http://cppcms.com/wikipp/en/page/cppcms_1x_json 를 참조해 주세요.

SHTML을 사용할 수 있는 최소한의 웹 서비스에는 Open SSL이 포함됩니다.

다음으로 Open 이외의 프레임워크를 호출하지 않고 TCP/IP를 사용하는 단순한 C++ SHTML 서버의 예를 나타냅니다.SSL

여기 300개의 언어별 Restful Frameworks 목록이 있습니다.

이 답변 작성 시점에서는 "C++"에 대한 보다 포괄적인 목록이 60개 이상의 항목을 생성합니다.

언급URL : https://stackoverflow.com/questions/25057819/how-to-create-restful-web-services-using-c-language-and-json-parser

반응형