web-dev-qa-db-fra.com

Obtenir le paramètre de demande avec Play Framework?

J'apprends le cadre de jeu et je comprends que je peux mapper une demande telle que /manager/user comme:

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

Comment mapper une demande comme /play/video?video_id=1sh1?

24
user2054833

Vous avez au moins deux possibilités, appelons-les approach1 et approach2.

  1. Dans la première approche, vous pouvez déclarer un paramètre routes avec une valeur par défaut. 0 est un bon candidat, car il sera plus facile de créer une condition par-dessus. Il s'agit également de typesafe et se pré-valide. Je voudrais recommander cette solution au début.
  2. La deuxième approche lit les paramètres directement à partir de la demande sous la forme d'un String, vous devez donc l'analyser en entier et valider en outre si nécessaire.

routes:

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

actions:

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 Je viens de réaliser que vous voulez utiliser l'identifiant de chaîne ... de toute façon les deux approches seront similaires :)

23
biesior

Je le ferais simplement en utilisant:

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

Et au contrôleur, vous auriez bien sûr quelque chose comme:

public static Result video(String video_id) {

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

}

Alternativement, vous n'avez pas besoin d'ajouter video_id:String puisque play semble traiter les paramètres comme String par défaut, donc cela fonctionne aussi comme ceci (au moins avec le jeu le plus récent):

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

Taper localhost:9000/play/video?video_id=1sh1 à la barre d'adresse devrait maintenant vous donner une vue qui imprime:

Nous avons obtenu l'ID vidéo de: 1sh1

Pour ajouter plus de paramètres est simple, comme ceci:

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

Manette:

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

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

}

Taper localhost:9000/play/video?video_id=1as1&site=www.google.com&page=3 à la barre d'adresse devrait maintenant vous donner une vue qui imprime:

Nous avons obtenu l'identifiant vidéo de: 1as1 site: www.google.com page: 3

Vous êtes les bienvenus ^^.

19
Mauno Vähä

Je ne suis pas sûr si j'ai compris ce que vous vouliez dire si vous vouliez simplement mapper une URL pour fonctionner dans le contrôleur, la réponse de biesior est parfaite, mais si vous voulez soumettre un formulaire avec la méthode get comme

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

 }

et ayant le paramètre du formulaire dans l'url au format réécrit url comme

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

Il n'y a aucun moyen de le faire car il s'agit de spécifications http

Je contourne souvent cette limitation en obtenant les paramètres dans la première fonction du contrôleur, puis en les redirigeant vers une autre vue, comme la suivante

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)));
}      

Ensuite, ayez tout dans la page2

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

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

Et avoir ceci dans le fichier routes:

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

J'espère que ça aiderait mais je ne suis pas sûr que ce soit la meilleure pratique

4
Siavosh

Ok donc je viens de lire la documentation et ce que je comprends, c'est que vous devez

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

Et puis dans le contrôleur, appelez le getQueryString de l'objet HttpRequest

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

2
smk