Libzeep é uma estrutura de aplicativos da web escrita em C ++. Para ver um projeto inicial, visite a página Libzeep-Webapp-Starter.
O Libzeep foi desenvolvido originalmente para facilitar a criação de servidores de sabão. E como trabalhar com sabão significa trabalhar com XML e nenhuma biblioteca decente C ++ XML existia no meu radar, criei uma biblioteca XML completa também.
Infelizmente (bem, considerando o trabalho que fiz), o REST provou ser mais popular que o SOAP e, portanto, adicionei uma melhor implementação JSON à versão 4 do Libzeep, bem como uma maneira de criar servidores REST com mais facilidade.
Mas então eu tive que usar a primavera por algum tempo e fiquei impressionado com a simplicidade de construir aplicativos interativos da Web e pensei que deveria trazer essa simplicidade ao mundo C ++. Afinal, meus aplicativos precisam de velocidade bruta e não, o Java não é rápido.
A encarnação atual de Libzeep, versão 6.0, é um conjunto de bibliotecas completamente refatoradas. Um para manipular o XML, um para lidar com o JSON e outro para a criação de aplicativos da Web.
A parte XML do Libzeep consiste em um analisador validador, uma implementação de nós DOM (semelhantes), um mecanismo de pesquisa XPath e um escritor/formatador XML. A validação funciona com base nas definições doctype.
Observe que a Libzeep visa fornecer um processador XML totalmente compatível, conforme especificado pela organização W3 (consulte: www.w3.org/tr/xml). Isso significa que é tão rigoroso quanto o padrão exige e interrompe o processamento de um arquivo quando uma validação da bem-formação é encontrada ou quando um documento parece ser inválido quando estiver no modo de validação. O relatório de erro é feito neste caso.
A biblioteca JSON em si é bastante simples. Existem alternativas muito melhores se você estiver procurando apenas JSON. Mas essa implementação é necessária pela parte do aplicativo da web.
E então temos uma biblioteca de aplicativos da web. Este facilita a criação de um servidor HTTP que serve HTML, mas também fala descanso e sabão. A implementação atual consiste em uma classe de servidor HTTP à qual você pode adicionar controladores. Cada controlador possui um prefixo de caminho e lida com solicitações de algumas entradas neste caminho URI. O controlador de classe base é simples e, de fato, é apenas uma classe base.
O controlador HTML pode ser usado como uma classe base para que você possa adicionar métodos que serão chamados para certos caminhos de URI. Em combinação com os processadores de tags disponíveis, você pode criar e retornar páginas dinâmicas xhtml.
Da mesma forma, o restante e os controladores de sabão podem ser usados como classes base para exportar métodos que pegam parâmetros nomeados simples ou complexos e retornam as estruturas de dados JSON e SOAP envoltas, respectivamente.
A documentação completa pode ser encontrada em:
www.hekkelman.com/libzeep-doc/
Para construir Libzeep, você precisa instalar o CMake.
Você também precisa ter instalado a biblioteca Howard Hinnants.
E, a menos que você esteja usando o MacOS, é recomendável instalar o MRC para ter suporte de recursos no Libzeep.
Os comandos para construir libzeep a partir da linha de comando são, por exemplo:
git clone https://github.com/mhekkel/libzeep
cd libzeep
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
ctest --test-dir build
cmake --install build Crie um modelo no XHTML primeiro, armazene -o como hello.xhtml em um diretório chamado docroot :
<! DOCTYPE html SYSTEM "about:legacy-compat">
< html xmlns = " http://www.w3.org/1999/xhtml "
xmlns : z = " http://www.hekkelman.com/libzeep/m2 " >
< head >
< title >Hello</ title >
</ head >
< p >Hello, < span z : text = " ${name ?: 'world'} " />!</ p >
</ html > Em seguida, crie um arquivo de origem chamado http-server.cpp com o seguinte conteúdo:
# define WEBAPP_USES_RESOURCES 0
# include < zeep/http/server.hpp >
# include < zeep/http/html-controller.hpp >
# include < zeep/http/template-processor.hpp >
class hello_controller : public zeep ::http::html_controller
{
public:
hello_controller ()
{
map_get ( " " , &hello_controller::handle_index, " name " );
map_get ( " index.html " , &hello_controller::handle_index, " name " );
map_get ( " hello/{name} " , &hello_controller::handle_index, " name " );
}
zeep::http::reply handle_index ( const zeep::http::scope& scope,
std::optional<std::string> user)
{
zeep::http::scope sub (scope);
sub. put ( " name " , user. value_or ( " world " ));
return get_template_processor (). create_reply_from_template ( " hello.xhtml " , sub);
}
};
int main ()
{
zeep::http::server srv ( std::filesystem::canonical ( " docroot " ));
srv. add_controller ( new hello_controller ());
srv. bind ( " :: " , 8080 );
srv. run ( 2 );
return 0 ;
} Crie um arquivo CMakeLists.txt :
cmake_minimum_required ( VERSION 3.16)
project (http-server LANGUAGES CXX)
set (CXX_EXTENSIONS OFF )
set (CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED ON )
find_package (zeep REQUIRED)
add_executable (http-server http-server.cpp)
target_link_libraries (http-server zeep::zeep)E configurar e construir o aplicativo:
cmake .
cmake --build .E então execute:
./http-serverAgora você pode acessar o resultado usando os seguintes URLs: