Обработка недопустимого типа данных в удаленной функции CF

Итак, у меня есть удаленная функция ColdFusion, например:

remote string function name (required numeric varname){

Доступ к этому осуществляется через вызов AJAX. Google взял на себя обязательство передавать ненужные/пустые значения URL-адресу этой удаленной функции. Как я могу изящно справиться с тем, чтобы боты/пользователи могли получить нежелательное значение. Я пытался поместить try/catch вокруг/внутри функции и не работает. Я также пытался установить значение по умолчанию, но все равно получаю сообщение об ошибке. Я хотел бы иметь возможность возвращать сообщение об ошибке.

Мысли?

Прямо сейчас:

domain.com/path/to/page.cfc?method=function&varname=

Выдает ошибку

domain.com/path/to/page.cfc?method=function&varname=5

Работает как положено.


person Leeish    schedule 28.03.2013    source источник


Ответы (2)


Обновление:

Я оставляю это здесь для потомков, так как это объясняет причину ошибки и цепочку событий с проверкой. Однако ответ Адама является правильным решением IMO.


remote string function name (required numeric varname){

Я пытался поместить try/catch вокруг/внутри функции и не работает.

Поскольку значение аргумента проверяется перед, CF выполняет что-либо внутри функции. Так что до try/catch дело даже не доходит.

Если вы хотите разрешить нечисловые значения, вы должны установить тип аргумента string и выполнить проверку внутри функции. то есть

      // use whatever check is appropriate here
      if ( IsNumeric(arguments.varname) ) { 
          // good value. do something
      }
      else {
          // bad value. do something else
      }

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

domain.com/path/to/page.cfc?method=function&varname=

Обновить Причина, по которой это не работает, заключается в том, что параметр varname действительно существует. Его значение — пустая строка. Пока передается некоторое значение (даже пустая строка), default игнорируется.

person Leigh    schedule 28.03.2013
comment
Ну, я не ХОЧУ разрешать нечисловые значения. Таким образом, numeric в объявлении аргумента. Но если это единственный способ сделать это, я могу сделать isNumeric проверку. Это кажется неоптимальным. Других способов нет? - person Leeish; 28.03.2013
comment
Других способов нет Не совсем так. У вас не может быть и того, и другого. Использование numeric говорит о том, что вы хотите отклонить нечисловые значения, что и происходит. Вы просто не можете контролировать возвращаемую ошибку. В других языках вы, вероятно, могли бы использовать перегрузку для создания версии, которая принимает string и возвращает собственное сообщение об ошибке. Насколько я знаю, в CF это невозможно. (Редактировать: я не на 100% уверен в CF10). - person Leigh; 28.03.2013
comment
Хотя это и не так подробно, как насчет реализации общего try/catch внутри onCFCRequest? Перехватите эту конкретную ошибку проверки и вместо этого выведите собственное сообщение об ошибке. - person Leigh; 28.03.2013
comment
У меня есть общий обработчик ошибок, который эффективно обрабатывает все ошибки и обрабатывает эту. Хотя общий onCFCRequest (о существовании которого я не знал) тоже будет работать, я хочу вернуть конкретное сообщение об ошибке в отношении этой функции. Поэтому я думаю, что ваш первый ответ - тот, который я хочу. Если бы я был тем, кто с самого начала разрабатывал все эти приложения, я бы использовал это onCFCRequest и отправил общее значение object.error, и все мои запросы искали бы это. В настоящее время это не так. - person Leeish; 28.03.2013
comment
Я согласен, что это может показаться неоптимальным, но я только что запустил тестовый пример, используя isNumeric() 50 000 раз, и общее время обработки (для 50 000 запусков) каждый раз составляло от 0 до 31 мс. - person Matt Busche; 28.03.2013

Я не согласен с тем, что принятое решение является лучшим подходом здесь.

Во-первых, если ваш метод ожидает числовое значение, а ему передается строка, то здесь ошибка — это как раз правильная реакция. Вы не должны чувствовать необходимость смягчать запросы, которые передают недопустимые значения. Представьте, что кто-то делает запрос к http://some.domain/path/to/file/wrongOne.html (они должны были запросить http://some.domain/path/to/file/rightOne.html)... совершенно нормально, что вещи возвращают "ошибку" 404, не так ли? Ответ об ошибке точно подходит в этой ситуации.

Точно так же вы указали, что для вашего URL-адреса удаленного вызова этот аргумент должен быть числовым. Итак, если это не числовое значение... это является ошибкой. Таким образом, ваш сервер, возвращающий ошибку типа 500, на самом деле является правильным решением.

Это пример правила «мусор на входе, мусор на выходе».

Если вы ищете элегантное решение, я бы сказал, что у вас уже есть самое элегантное решение. Не возитесь с написанием специального кода для обработки неправильно сделанных запросов. Это не элегантный подход.

Лучше допустить ошибку, потому что тогда механизм, запрашивающий URL, перестанет это делать. Плохо возиться, возвращая 200 OK для запроса, который не был "ОК".

Ошибки - когда они являются правильным результатом - это нормально. В них нет ничего плохого.

person Adam Cameron    schedule 28.03.2013
comment
(Редактировать - Черт бы побрал этот 5-минутный лимит времени!) Я бы с этим согласился. Как я упоминал в комментариях, проверка делает то, что должна делать. Но мой ответ был больше сосредоточен на объяснении цепочки событий и доступных вариантов. Я пропустил самое важное: если это должно потерпеть неудачу, пусть это будет. - person Leigh; 29.03.2013
comment
Все нормально. Во всяком случае, это дало мне тему для моего блога сегодня ;-) - person Adam Cameron; 29.03.2013
comment
Ха-ха, рад быть полезным ;-) Я с нетерпением жду того, что вы придумаете, так что опубликуйте ссылку, когда это будет сделано. - person Leigh; 29.03.2013
comment
Тогда загадай мне это. Мой сервер отправляет мне электронное письмо в функции onError. Таким образом, я могу увидеть, есть ли ошибка в коде, и исправить ее. Я часто использую этот шанс, чтобы вставить операторы try/catch, чтобы обеспечить обратную связь, если что-то пойдет не так. Я НЕНАВИЖУ получать электронные письма об ошибках, когда боты помещают мусор. Каков наилучший порядок действий. Удалите электронное письмо и рассматривайте его как часть работы или разработайте мой код так, чтобы ВСЕ ошибки получали обратную связь. Почти все наши ошибки перехватываются функцией onError, но мне часто нравится завершать загрузку/запрос страницы и сообщать им, что что-то пошло не так. - person Leeish; 29.03.2013
comment
Моя мысль заключается в том, что я лучше поймаю ошибки там, где они происходят, и сообщу пользователю, что данные были искажены и т. д., чем позволю функции onError поймать ее и отобразить половину страницы с общей ошибкой что-то пошло не так. Похоже, что с функциями REMOTE я не могу использовать оба способа и иметь упрощенный код. - person Leeish; 29.03.2013
comment
Но, как вы сказали... эти ошибки в любом случае возникают из-за неправильного использования функции (вероятно, ботом), поэтому вы либо отправляете приятное сообщение боту (которому все равно), либо хакеру (которому вы должны не помогать). При правильном использовании это вызывается через AJAX, да? В этом случае то, что вы должны иметь дело с ошибкой 500 на стороне клиента и сказать, что что-то пошло не так, это все равно не должно обрабатываться вашим кодом метода. - person Adam Cameron; 29.03.2013