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
?
Vous avez au moins deux possibilités, appelons-les approach1
et approach2
.
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.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 :)
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 ^^.
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¶m2=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
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