пятница, 11 декабря 2009 г.

XML-RPC

Сегодня пишу на айтишные темы.

Наши партнеры предоставляют XML-RPC API. Это нечто среднее по сложности между SOAP и "простым" (plain) XML. В отличие от plain XML, не нужно вручную парсить ответ сервера - по идее, этим должна заниматься некоторая библиотека. Она же должна формировать XML с твоим запросом.

Я почему-то был уверен, что поддержка XML-RPC есть в стандартной поставке WCF. Хм, нет. Быстрое гугление привело меня на блог Клеменса Вастерса, который такую библитеку написал. Выглядит вроде прилично. Прекрасно - скачал, стал пробовать вызывать сервис нашего партнера. Вывалился exception. Я не сразу врубился, думал, что это я что-то не так делаю.

Оказывается, партнер благополучно получил мой запрос и вернул fault. Обычная рабочая ситуация - я запросил информацию о стране, которой не было в их базе, они вернули нормальное сообщение об ошибке. Очевидно, каким-то образом библиотека может выдать мне эту информацию? Но после долгих поисков в исходном коде я с ужасом понял: великий Клеменс Вастерс просто не сделал поддержку faults. Т.е. он предполагает, что мы живем в идеальном мире, где веб-сервисы никогда не возвращают ошибки.

Конечно, я мог бы и сам дописать этот кусочек (а возможно, потом прославить свое имя, выложив его в Интернет). Но, во-первых, это как-то дико. Я понимаю, если бы мне, скажем, пришлось своими руками написать поддержку WCF для ССП НБУ (Системы Срочных Переводов Нацбанка Украины), которая никому в мире не известна. Но XML-RPC уже лет 10, он и широко использовался. Почему я должен тратить свое время на такое? Во-вторых, я как-то очень расстроился: кто знает, может там внутри ещё запрятана куча менее очевидных глюков?

Поэтому я скачал другую библиотеку с сайта Cook Computing. Она не такая гламурная (не WCF), но работает нормально.

Итак, обмен данными налажен, но всё равно какие-то проблемы остались. Теперь они явно связаны не самим протоколом, а уже с партнером. В их документации не очень чётко написано, как передавать параметры (массив, структура на всех, структура на каждого и пр.) Я написал: "Не могли бы Вы прислать мне примеры правильных XML-запросов к таким-то и таким-то методам? А то они возвращают не совсем то, что я ожидал". Ответ был совершенно неожиданный для меня:

- К сожалению, по юридическим причинам мы не можем давать примеры исходного кода (а то вдруг там ошибка, а Вы его будете использовать, потеряете миллионы и будете с нами судиться).
- Погодите... Я же не прошу у вас примеры кода на C# или PHP. Я просто просил пример вызова API. С моей точки зрения, это неотъемлимая часть документации...
- А мы считаем, что это пример кода. И именно поэтому по юридическим причинам я не могу прислать тебе вот такое (пример XML) и вот такое (пример его генерации на PHP). О, чуть не забыл - и вот такое (пример на Perl) я тоже абсолютно не имею права посылать. Но если бы я тебе это послал, то ты бы использовал это на свой страх и риск, наша фирма не несет никакой ответственности...
- Спасибо, теперь всё стало ясно!

Комментариев нет:

Ratings by outbrain