Get request parameter with Play Framework?

2019-02-03 01:02发布

问题:

I am learning play framework and understand that I can map a request such as /manager/user as:

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

How would I map a request like /play/video?video_id=1sh1?

回答1:

You have at least two possibilities, let's call them approach1 and approach2.

  1. In the first approach you can declare a routes param with some default value. 0 is good candidate, as it will be easiest to build some condition on top of it. Also it's typesafe, and pre-validates itself. I would recommend this solution at the beginning.
  2. Second approach reads params directly from request as a String so you need to parse it to integer and additionally validate if required.

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 I just realized that you want to use String identifier... anyway both approaches will be similar :)



回答2:

I would do it simply using:

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

And at controller you would of course have, something like:

public static Result video(String video_id) {

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

}

Alternatively, you dont have to add video_id:String since play seems to treat parameters as String by default, so it also works like this (at least with newest play):

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

Typing localhost:9000/play/video?video_id=1sh1 to address bar should now you give view which prints:

We got video id of: 1sh1

To add more parameters is simple, like this:

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

}

Typing localhost:9000/play/video?video_id=1as1&site=www.google.com&page=3 to address bar should now you give view which prints:

We got video id of: 1as1 site: www.google.com page: 3

You're welcome ^^.



回答3:

I'm not quite sure if I got what you meant if you meant just to map a url to function in controller the answer of biesior is perfect but if you mean submitting a form with get method like

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

 }

and having the form's parameter in the url in the url-rewrited format like

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

There is no way to do that because that's http specs

I do often circumvent this limitation by getting the parameters in the first function in controller and then redirect them to another view just like the following

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

Then have whatever in the page2

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

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

And have this in the routes file :

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

I hope it'd help but I'm not sure that's the best practise



回答4:

Ok so I just read up the documentation and what I understand is that you need to

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

And then in the controller call the getQueryString of the HttpRequest object

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