Я пытаюсь сделать веб-службу JSON Restful на C/С++. Я пробовал Axis2/C и Staff, которые отлично подходят для сериализации/десериализации XML, но не для JSON.
Способы реализации службы JSON RESTful в C/С++
Ответ 1
Вы можете взглянуть на Casablanca, представленный в Блог Herb Sutter.
Ответ 2
Вы можете посмотреть ffead-cpp. Помимо предоставления поддержки json и restfull веб-сервисов, он также включает в себя больше возможностей. Однако эта структура может быть слишком тяжелой для вашей ситуации.
Ответ 3
Попробуйте ngrest. Это простой, но быстрый С++ RESTful JSON Web Services. Он может быть развернут поверх Apache2, Nginx или собственного простого HTTP-сервера.
Относительно Axis2/C с JSON. Похоже, что официальный Axis2/C больше не поддерживается. Таким образом, Axis2/C становится устаревшим (но все еще работает).
Поддержка JSON для Axis2/C доступна в проекте axis2c-unofficial.
Есть инструкции по установке, как установить Axis2/C с поддержкой JSON в Linux, Windows с использованием двоичного пакета, Windows из исходного кода.
Вы можете попробовать его с помощью WSF Staff, используя пример клиентов (REST) в режиме JSON (который доступен из каталога staff/samples/rest/webclient
исходного кода персонала).
Ответ 4
Для веб-службы С++ я использую следующий стек:
- ipkn/crow С++ micro web framework
- nlohmann/json для сериализации/десериализации json.
Ответ 5
попробуйте https://github.com/babelouest/ulfius отличную библиотеку для создания C/C++ Restful API. может поддерживать все платформы: Linux, FreeBSD, Windows и другие
Ответ 6
Существует проект JIRA, который разрешил поддержку JSON в AXIS2/C.
Я реализовал в своем проекте, и я справился с автором (соглашение Badgerfish), но все же я пытаюсь справиться с читателем.
Кажется, что сложнее управлять со стек в памяти.
Ответ 7
JSON и JSONPath поддерживаются как для C, так и для С++ в gsoap с новым генератор кода и новый JSON API, чтобы вы начали быстро.
В комплект включены несколько JSON, примеры JSON-RPC и REST. Управление памятью осуществляется автоматически.
Генератор кода может быть полезен. Возьмем, к примеру, json.org menu.json
фрагмент:
{ "menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}
}
Команда gsoap jsoncpp -M menu.json
генерирует этот код для заполнения значения JSON:
value x(ctx);
x["menu"]["id"] = "file";
x["menu"]["value"] = "File";
x["menu"]["popup"]["menuitem"][0]["value"] = "New";
x["menu"]["popup"]["menuitem"][0]["onclick"] = "CreateNewDoc()";
x["menu"]["popup"]["menuitem"][1]["value"] = "Open";
x["menu"]["popup"]["menuitem"][1]["onclick"] = "OpenDoc()";
x["menu"]["popup"]["menuitem"][2]["value"] = "Close";
x["menu"]["popup"]["menuitem"][2]["onclick"] = "CloseDoc()";
Кроме того, с помощью этого инструмента может быть сгенерировано чтение проанализированных значений JSON и кода JSONPath.
ИЗМЕНИТЬ
Чтобы уточнить, генератор кода jsoncpp командной строки показывает код API для чтения и записи данных JSON с использованием .json файла в качестве шаблона, который, как я нашел, полезен для экономии времени на запись код API для заполнения и извлечения данных JSON. Код запроса JSONPath также может быть сгенерирован с помощью этого инструмента.
Ответ 8
Вы можете взглянуть на webcc.
Это облегченная клиентская и серверная библиотека C++ REST и SOAP, основанная на Boost.Asio(1. 66+).
Это довольно перспективно и активно развивается.
Есть отличные примеры, чтобы продемонстрировать, как создать сервер и клиент.
Преимущества:
- Код очень чистый (строго следуя стилю Google C++).
- Нет утечки памяти в соответствии с тестом VLD.
- Простые в использовании API.
- и т.п.
Недостатки:
- Пока не поддерживается SSL.
- Не может быть развернут на существующих веб-серверах, таких как Nginx, потому что он управляет своим собственным HTTP-сервером.
Ответ 9
Есть небольшое количество библиотек, которые поддерживают создание служб отдыха с помощью
#include <restinio/all.hpp>
int main()
{
restinio::run(
restinio::on_this_thread()
.port(8080)
.address("localhost")
.request_handler([](auto req) {
return req->create_response().set_body("Hello, World!").done();
}));
return 0;
}