Играть в! 2.0 легко исправить ответ OPTIONS для универсального маршрутизатора?

Возникли некоторые раздражающие проблемы с вызовами AJAX просто потому, что почти каждый браузер в наши дни выполняет вызов OPTIONS на сервер перед фактическим вызовом AJAX.

Поскольку я использую Play! 2.0, есть ли какой-нибудь простой способ сделать подстановочный ответ на любой маршрут, используя метод OPTIONS?

Например, в моих маршрутах сделайте что-то вроде: OPTIONS /* controllers.Options.responseDef

Да Я знаю, что новый Play! не имеет встроенного подстановочного знака, но для этого должно быть решение, поскольку все браузеры все чаще вызывают OPTIONS перед вызовами AJAX.


person crockpotveggies    schedule 29.06.2012    source источник


Ответы (2)


Не совсем подстановочный знак, но вы можете использовать route, который охватывает несколько сегментов косой черты:

OPTIONS   /*wholepath     controllers.Options.responseDef(wholepath)
OPTIONS   /               controllers.Options.responseDef

Он должен соответствовать всем запросам:

OPTIONS    /a
OPTIONS    /a/b
OPTIONS    /a/b/c

Примечание: это из моей головы, так что, возможно, вам нужно будет отшлифовать его. Сам проверить сейчас не могу.

См. раздел Динамические части, охватывающий несколько / руководства.

person biesior    schedule 29.06.2012
comment
Интересно, *wholepath — недавно добавленная функция? Я только что обновился до 2.0.1, это кажется новой функцией;) Я протестирую ее и сообщу, работает ли она :) - person crockpotveggies; 01.07.2012
comment
Нет, он доступен с версии 2.0 (0). Я думаю, не помню, что более важно, я только что понял, мы можем использовать его для решения других проблем с маршрутизацией, т.е. чтобы избежать избыточных косых черт в конце: groups.google.com/d/msg/ play-framework/yGCubIgnP2o/lFOUl0Ccvw8J :) Кстати, конечно wholepath это просто имя переменной, вы можете использовать любое другое имя, самое главное это звездочка перед именем *some вместо двоеточия :some - person biesior; 01.07.2012
comment
Кажется, здесь что-то не так... этот маршрут (и маршруты регулярных выражений) не будут компилироваться с Cannot use a method returning play.api.mvc.SimpleResult - person crockpotveggies; 02.07.2012
comment
странно, я тестировал это, и это сработало, но это было проверено с помощью действий Java. ваше responseDef действительное действие Play? - person biesior; 02.07.2012
comment
Правильно, я просто добавил def к другому контроллеру и сослался на него, как обычно. Я собираюсь попробовать обновиться до 2.0.2 и посмотреть, исправит ли это проблему. - person crockpotveggies; 02.07.2012
comment
Тестировал с 2.0.1 и 2.0.2, в этой теме не должно быть различий между версиями. - person biesior; 02.07.2012
comment
А, это моя ошибка, опечатка. Я облажался с = Action { битом. Все хорошо :) - person crockpotveggies; 02.07.2012

Очень простой способ, чтобы конечная точка одного контроллера соответствовала всем запросам OPTIONS, — это переопределить метод onRouteRequest Глобальный объект Play. Следующая версия onRouteRequest будет направлять все запросы к одной конечной точке с именем OptionsController.options.

import play.api.mvc._

...

override def onRouteRequest(request: RequestHeader): Option[Handler] = {
  request.method match {
    case "OPTIONS" => Some(OptionsController.options)
    case _ => super.onRouteRequest(request)
  }
}
person msiebert    schedule 20.02.2015