ColdFusion 10 REST API: как заставить cfthrow возвращать JSON со свойствами Camel Case

Я использую новый REST API ColdFusion 10. Скажем, я выбрасываю это исключение:

<cfthrow errorcode="400" message="Validation error." type="ValidationException" />

ColdFusion хорошо обрабатывает исключения и возвращает этот JSON в теле ответа:

{"Message":"Validation error.","Type":"ValidationException"}

Обратите внимание, что свойства «Сообщение» и «Тип» генерируются в регистре Паскаля (первая буква в верхнем регистре). Чтобы это соответствовало всему остальному в моем API, мне нужно, чтобы свойства были Came Case (первая буква в нижнем регистре), например следующее:

{"message":"Validation error.","type":"ValidationException"}

Любая идея, как я могу это сделать? Я ищу способ настроить способ, которым ColdFusion генерирует JSON, без ручного выполнения cfcatch и самостоятельного создания JSON.


person Johnny Oshika    schedule 04.04.2013    source источник


Ответы (2)


<cfcatch> и верните свою собственную строку JSON, созданную на основе сообщения об исключении и его сведений.

Я не думаю, что вы можете настроить его, если у вас нет исходного кода от Adobe. :)

person Henry    schedule 04.04.2013
comment
Вот чего я боялся. Чем больше я знакомлюсь с REST API CF 10, тем больше мне приходится переопределять встроенные функции. - person Johnny Oshika; 05.04.2013
comment
Я не играл с REST в CF10 (мы все еще используем CF9), но в последнее время я слышал много жалоб. Может быть, пришло время сразу перейти к Scala Play. - person Henry; 05.04.2013

Если вы используете IIS с ColdFusion, вот способ решить эту проблему, не прибегая к использованию <cfcatch> и переносу собственного ответа на каждую конечную точку API (что является настоящей проблемой).

Я написал HttpModule в .NET, который подключается к конвейеру ответов IIS для изменения ответа, возвращаемого ColdFusion. Это мешает только в том случае, если Content-Type ответа равен application/json, а код состояния не начинается с 2 (т. е. это не успешный ответ). Весь код доступен здесь:

https://github.com/johnnyoshika/coldfusion-rest-post-process

Вот как использовать HttpModule.

1) Загрузите DLL

Возьмите отсюда файл ColdFusion.RestPostProcess.dll и поместите его в папку bin вашего приложения ColdFusion:

https://github.com/johnnyoshika/coldfusion-rest-post-process/tree/master/bin/Release

Например, если ваше приложение ColdFusion находится здесь:

C:/myapp

Затем вы хотите поместить dll сюда:

C:/myapp/bin/ColdFusion.RestPostProcess.dll

Если вы не хотите доверять чужой DLL, вам нужно просмотреть исходный код и самостоятельно скомпилировать проект в Visual Studio для создания DLL.

2) Изменить web.config

Измените или создайте файл web.config в корне вашего приложения. Содержание должно быть примерно таким:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <httpModules>
            <!-- This is for IIS5, IIS6, and IIS7 Classic -->
            <add name="JsonCamelCasePropertyConverterModule" type="ColdFusion.RestPostProcess.JsonCamelCasePropertyConverterModule"/>
        </httpModules>
    </system.web>
    <system.webServer>
        <modules>
            <!-- This is for IIS7+ Integrated mode -->
            <add name="JsonCamelCasePropertyConverterModule" type="ColdFusion.RestPostProcess.JsonCamelCasePropertyConverterModule"/>
        </modules>
    </system.webServer>
</configuration>

Вот и все. Ваш ответ об ошибке теперь будет выглядеть так:

{"message":"Email is invalid.","type":"ValidationException"}

Если вы хотите узнать, как я создал этот HttpModule, исходный код доступен здесь:

https://github.com/johnnyoshika/coldfusion-rest-post-process/blob/master/JsonCamelCasePropertyConverterModule.cs

и тут:

https://github.com/johnnyoshika/coldfusion-rest-post-process/blob/master/UTF8SanitizerStream.cs

person Johnny Oshika    schedule 05.04.2013
comment
То же самое .. и отличные инструкции. +1 - person Leigh; 06.04.2013