Внимательное отношение к стандартам

По ходу работы пришлось мне немного освоить perl, для того, чтобы помочь нашим партнёрам написать SOAP-клиента для нашей системы (уже забавно, помогать знающим язык, параллельно его изучая). Использовалась там более-менее стандартная библиотека SOAP::Lite. Но, когда я работал над клиентом у меня стояла её довольно ранняя версия, под которой я успешно отладил пример, и отдал его для дальнейшей эксплуатации. Проблема всплыла позже, когда партнёры стали заводить систему у себя. И обнаружили, что сообщения об ошибке возвращаются от них не в совсем том виде, в котором ожидает наша система, а именно подробности об ошибке в detail были как-то странно закодированы. Для наших компонент эта часть сообщения была весьма критичной и начали разбираться. Сначала выкопал, что ребята вообще не запарились включить поддержку юникода в своём скрипте, а потом стало ясно, что версии библиотек у нас не совпадают. Обновил свою и радостно увидел ту-же самую муть, что приходила от них. В поисках решения перекопал кучу страниц, и в одном документе увидел интересный момент в описании SOAP::Fault:

Note that fault detail content in a message is represented as tag blocks.

Что привело меня на волшебный документ – спецификацию, в которой подразумевается, что в detail должны быть дочерние элементы:

All immediate child elements of the detail element are called detail entries and each detail entry is encoded as an independent element within the detail element.

Авторы библиотеки явно строго последовали этому принципу и не оставили лазейки для передачи там обычной строки. Система, не рассчитанная на такую возможность, оказалась без возможности взаимодействовать по стандартам и требует доработки. Отсюда вывод: даже если инструментарий позволяет немножко нарушать стандарты, это не повод о них забывать – они могут аукнуться совсем неожиданно.

Leave a Reply