Как обернуть библиотеку C, чтобы ее можно было вызывать из веб-службы - PullRequest
6 голосов
/ 10 февраля 2010

У нас есть библиотека с очень сложной логикой, реализованной на C. Она имеет интерфейс командной строки с не слишком сложными аргументами на основе строк. Чтобы получить к этому доступ, мы хотели бы обернуть библиотеку, чтобы к ней можно было обращаться с помощью простого XML RPC или даже простых вызовов HTTP POST.

Имея некоторый опыт работы с Java, моя первая идея будет

  • Обернуть библиотеку в JNI / JNA
  • Используйте тонкий стек WS и движок сервлета
  • Запросы прокси через Apache к сервлету

Я считаю, что уже должно быть что-то простое, что можно было бы использовать, поэтому я публикую этот вопрос здесь. Решение имеет следующие требования

  • Он должен быть развернут в текущем дистрибутиве Linux, предпочтительно уже доступен через управление пакетами
  • Он должен интегрироваться со стандартным веб-сервером (как в моем примере Apache)
  • Небольшие изменения в интерфейсе библиотеки должны быть управляемыми
  • Сквозное (HTTP-WS-library-WS-HTTP) решение не должно вызывать чрезмерных затрат, но надежность очень важна

В качестве альтернативы предложению JNI / JNA, я думаю, что в мире C # не должно быть слишком сложно написать веб-сервис и назвать этот модуль неуправляемый код , но я надеюсь, что кто-то может дать мне несколько советов которые возможны в отношении требований.

Ответы [ 6 ]

2 голосов
/ 11 февраля 2010

Если вы собираетесь использовать веб-сервисы, возможно, Soaplab будет полезен. Это в основном инструмент для упаковки существующих приложений командной строки в веб-сервисы SOAP. Генерируемые им веб-службы выглядят немного странно, но это довольно популярный способ заставить что-то подобное работать.

1 голос
/ 11 февраля 2010

Создать модуль apache довольно легко, и, поскольку вы знакомы с xmlrpc, вы должны проверить mod-xmlrpc2. Вы можете легко добавить свой код C в этот модуль apache и запустить сервер xmlrpc за считанные минуты

1 голос
/ 11 февраля 2010

Я думаю, вы также можете опубликовать его как веб-сервис на основе SOAP. gSoap может использоваться для предоставления интерфейса службы из библиотеки. Вы изучали gSOAP? Смотри http://www.cs.fsu.edu/~engelen/soap.html

С уважением, Kangkan

0 голосов
/ 11 февраля 2010

Если вы идете по маршруту JNI, проверьте SWIG. http://www.swig.org/Doc1.3/Java.html

При условии, что у вас есть заголовки для проецирования привязок, с swig довольно легко работать.

0 голосов
/ 11 февраля 2010

Сейчас я делаю то же самое с C ++. В моем случае я пишу модуль PHP, чтобы позволить скриптам PHP получать доступ к логике в моей библиотеке C ++.

Затем я могу использовать любой формат, который я хочу, чтобы позволить остальному миру увидеть его - сначала это будет только через веб-приложение PHP, но я также буду разрабатывать интерфейс XML-RPC.

0 голосов
/ 11 февраля 2010

Зависит от того, какие технологии вам удобнее, что вы уже установили и работаете на своих серверах, и каковы ваши требования к нагрузке.

Как насчет сырого CGI? Предполагая, что код C не поддерживает состояния между запросами, вы можете сделать это, не изменяя библиотеку вообще. Напишите простой скрипт, который извлекает параметры запроса из среды CGI, возможно, очищает входные данные, вызывает библиотеку через интерфейс командной строки и упаковывает результат в любой ответ HTTP, который вы хотите. Затем настройте Apache для отправки соответствующих URL-адресов в этот сценарий. Например, Python поддерживает библиотеку XML-RPC, как и любой другой язык сценариев, используемый в Интернете.

Сервлеты звучат как излишние, но, например, если вам нужно несколько запросов на один экземпляр процесса CGI, и вы не хотите вмешиваться в конфигурацию Apache, тогда будет проще всего придерживаться того, что вы знаете.

...