2013-02-12 16 views
21

Sto imparando quadro gioco e capire che posso mappare una richiesta come /manager/user come:Ottieni il parametro di richiesta con Play Framework?

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

Come dovrei mappare una richiesta come /play/video?video_id=1sh1?

+0

/play/video? Video_id =: id Controllers.Application.vide (id: String) – smk

+0

Spero che funzioni. Suoni logici – smk

+0

Beh, non funziona c'è un metodo che puoi chiamare per estrarlo – user2054833

risposta

18

I lo farebbe semplicemente usando:

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

E al controllore si sarebbe naturalmente avere, qualcosa di simile a:

public static Result video(String video_id) { 

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

} 

In alternativa, non dovete aggiungere video_id:String dal gioco sembra trattare parametri come stringa di default, quindi funziona anche come questo (almeno con il più nuovo Play):

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

Digitando localhost:9000/play/video?video_id=1sh1 per affrontare barra dovrebbe ora dare a vista che stampa:

Abbiamo ottenuto il video id: 1sh1

Per aggiungere più parametri è semplice, in questo modo:

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

Controller:

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

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

} 

Digitando localhost:9000/play/video?video_id=1as1&site=www.google.com&page=3 per affrontare barra dovrebbe ora dare a vista che stampa:

Abbiamo l'ID video di: 1as1 sito: w pagina ww.google.com: 3

Prego ^^.

23

Hai almeno due possibilità, chiamiamole approach1 e approach2.

  1. Nel primo approccio è possibile dichiarare un percorso param con un valore predefinito. 0 è un buon candidato, in quanto sarà più semplice costruire alcune condizioni su di esso. Inoltre è typesafe e si pre-convalida. Vorrei raccomandare questa soluzione all'inizio.
  2. Il secondo approccio legge i parametri direttamente dalla richiesta come String quindi è necessario analizzarlo in numero intero e convalidarlo ulteriormente se necessario.

routes:

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

azioni:

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 Ho appena realizzato che si desidera utilizzare identificatore String ... in ogni caso entrambi gli approcci saranno :) simile

+0

Sai se esiste un modo di usare approach1 se i percorsi sono metodi 'POST' ei parametri sono aggiunti come parametri del modulo? Quando ho provato, il controller non riconosceva i valori dei parametri in ingresso ... – jlars62

4

Non sono sicuro di aver capito cosa intendevi se intendevi solo mappare un URL alla funzione nel controllo della risposta di biesior è perfetto, ma se si intende inviare un modulo con metodo get come

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

} 

e avere dei parametri del form nel URL nel formato URL riscritto come

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

Non c'è modo di farlo perché questa è la specifica http

Spesso evito questa limitazione ottenendo i parametri nella prima funzione nel controller e quindi reindirizzandoli a un'altra vista come la seguente

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

Poi hanno qualunque sia nella page2

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

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

E avere questo nel file rotte:

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

Spero che avrebbe aiutato, ma io non sono sicuro che sia la migliore pratica