ColdFusion 10 REST API: как установить код состояния 201 без RestSetResponse()

Я использую новый встроенный REST API ColdFusion 10 и хочу вернуть код состояния 201 (Создано). Сначала я попробовал подход RestSetResponse(), описанный здесь: http://www.adobe.com/devnet/coldfusion/articles/restful-web-services.html. Он работает хорошо, за исключением того, что вынуждает вас установить возвращаемый тип функции на "void". Проблема с «void» заключается в том, что всякий раз, когда я выбрасываю исключение, оно больше не возвращает правильное сообщение об ошибке JSON.

Выбрасывание этого исключения:

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

Возвращает красиво отформатированный JSON, когда возвращаемый тип — «struct»:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{"Message":"Validation error."}

Но когда тип возвращаемого значения «недействителен» (что требуется для использования RestSetResponse(), ответ представляет собой какой-то уродливый HTML-ответ.

Из-за этого мне пришлось вернуться к использованию возвращаемого типа "struct", отказаться от RestSetResponse() и попробовать следующее:

<cfheader statusCode="201" statusText="Created" />

Но это не работает. Кажется, что ColdFusion перезаписывает statusCode и всегда возвращает 200 (ОК) в случае успеха. Кто-нибудь знает способ изменить код состояния на 201, не устанавливая возвращаемый тип функции на «void»?


person Johnny Oshika    schedule 29.03.2013    source источник
comment
Не можете ли вы указать пользовательский контент в структуре ответа, как описано здесь?   -  person imthepitts    schedule 30.03.2013
comment
Я не могу этого сделать. Как упоминалось в моем вопросе, использование RestSetResponse() требует, чтобы возвращаемый тип был недействительным, что больше не учитывает правильный ответ JSON в случае исключения.   -  person Johnny Oshika    schedule 30.03.2013


Ответы (1)


Я не вижу веских причин, по которым restSetResponse() должен требовать возврата типа void, но проверил, что это игнорируется, если это не так. Что немного чушь.

Единственное, что я могу придумать, чтобы обойти вашу ситуацию, - это свернуть свою собственную структуру с подробностями об ошибке, а затем использовать ее в качестве значения content, установленного для вызова restSetResponse().

Это немного наспех построено, но я думаю, что в этом случае вы ограничены навязчивостью ColdFusion.

Я зарегистрировал ошибку, связанную с этим.

person Adam Cameron    schedule 31.03.2013
comment
К вашему сведению, я взял этот вопрос в качестве вдохновения для статьи в блоге, если вам интересно: adamcameroncoldfusion.blogspot.co.uk/2013/03/. - person Adam Cameron; 03.04.2013
comment
Спасибо Адам за подробный пост в блоге. Я надеюсь, что он послужит полезным артефактом для тех, кто сталкивается с той же проблемой. - person Johnny Oshika; 03.04.2013