Подтвердить что ты не робот

Получить параметр запроса в Play Framework?

Я изучаю структуру воспроизведения и понимаю, что я могу сопоставить запрос, например /manager/user, как:

  GET      /manage/:user    Controllers.Application.some(user:String)

Как мне сопоставить запрос типа /play/video?video_id=1sh1?

4b9b3361

Ответ 1

У вас есть как минимум две возможности, позвоните им approach1 и approach2.

  • В первом подходе вы можете объявить параметр route с некоторым значением по умолчанию. 0 является хорошим кандидатом, так как легче всего построить какое-то условие поверх него. Также он typesafe и предварительно проверяет себя. Я бы рекомендовал это решение в начале.
  • Второй подход считывает параметры непосредственно из запроса как String, поэтому вам нужно разобрать его на целое и дополнительно проверить, если требуется.

routes:

GET     /approach1      controllers.Application.approach1(video_id: Int ?=0)
GET     /approach2      controllers.Application.approach2

действия:

public static Result approach1(int video_id) {
    if (video_id == 0) return badRequest("Wrong video ID");
    return ok("1: Display video no. " + video_id);
}

public static Result approach2() {
    int video_id = 0;

    if (form().bindFromRequest().get("video_id") != null) {
        try {
            video_id = Integer.parseInt(form().bindFromRequest().get("video_id"));
        } catch (Exception e) {
            Logger.error("int not parsed...");
        }
    }

    if (video_id == 0) return badRequest("Wrong video ID");
    return ok("2: Display video no. " + video_id);
}

PS: LOL Я просто понял, что вы хотите использовать String identifier... в любом случае оба подхода будут похожи:)

Ответ 2

Я бы сделал это просто, используя:

GET /play/video      Controllers.Application.video(video_id:String)

А у контроллера у вас, конечно, есть что-то вроде:

public static Result video(String video_id) {

     return ok("We got video id of: " + video_id);

}

В качестве альтернативы вам не нужно добавлять video_id:String, так как игра по умолчанию обрабатывает параметры как String по умолчанию, поэтому она также работает так (по крайней мере, с новейшей игрой):

GET /play/video      Controllers.Application.video(video_id)

Набрав localhost:9000/play/video?video_id=1sh1 в адресную строку, теперь вы должны дать представление, которое печатает:

Мы получили идентификатор видео: 1sh1

Чтобы добавить дополнительные параметры, выполните следующие действия:

GET     /play/video                      controllers.Application.video(video_id:String, site:String, page:Integer)

Контроллер:

public static Result video(String video_id, String site, Integer page) {

    return ok("We got video id of: " + video_id + " site: " + site + " page: " + page);

}

Набрав localhost:9000/play/video?video_id=1as1&site=www.google.com&page=3 в адресную строку, теперь вы должны дать представление, которое печатает:

Мы получили идентификатор видео: сайт 1as1: www.google.com страница: 3

Добро пожаловать ^^.

Ответ 3

Я не совсем уверен, получил ли я то, что вы имели в виду, если бы вы имели в виду просто сопоставить url для работы в контроллере, ответ biesior идеально, но если вы хотите представить форму с методом get, например

@helper.form(action = routes.YourController.page1()) {

 }

и имеющий параметр формы в URL-адресе в переписанном URL-формате, например

page1/foo/bar instead of page1?param1=foo&param2=bar 

Нет никакого способа сделать это, потому что эта спецификация http

Я часто обхожу это ограничение, получая параметры в первой функции в контроллере, а затем перенаправляю их на другой вид, как показано ниже.

public static Result page1(){
   String param1 = Form.form().bindFromRequest().get("param1");
   String param2= Form.form().bindFromRequest().get("param2");

   return ( redirect( routes.YourController.page2(param1,param2)));
}      

Затем получим что-то в странице2

public static Result page2(String param1,String param2){

        ...............
 }

И это в файле маршрутов:

GET  page2/:param1/:param2        controllers.YourControllers.page2(param1 : String, param2 : String )

Я надеюсь, что это поможет, но я не уверен, что наилучшая практика

Ответ 4

Хорошо, поэтому я просто прочитал документацию и понимаю, что вам нужно

GET /play/video         Controllers.Application.video()

И затем в контроллере вызовите getQueryString объекта HttpRequest

http://www.playframework.com/documentation/api/2.1.0/java/index.html