NPhard has asked for the wisdom of the Perl Monks concerning the following question:

I try to post multiple select list in a http form query through LWP::agent ,but I can not figure out how to do it ,"select[]"=>qw(option1 option2) seems don't work,anyone can help me with this ? thanks a lot
  • Comment on how to post multiple select list through LWP::agent

Replies are listed 'Best First'.
Re: how to post multiple select list through LWP::agent
by ikegami (Patriarch) on Sep 09, 2008 at 21:42 UTC

    Given the form

    <FORM action="http://www.example.com/survey.cgi" method="POST"> <SELECT multiple name="select1"> <OPTION selected value="Component_1_1">Component_1</OPTION> <OPTION selected value="Component_1_2">Component_2</OPTION> <OPTION value="Component_1_3">Component_3</OPTION> <OPTION value="Component_1_4">Component_4</OPTION> </SELECT> <SELECT multiple name="select2"> <OPTION value="Component_2_1">Component_1</OPTION> <OPTION value="Component_2_2">Component_2</OPTION> <OPTION selected value="Component_2_3">Component_3</OPTION> <OPTION value="Component_2_4">Component_4</OPTION> </SELECT> <INPUT type="submit" value="Send"><INPUT type="reset"> </FORM>

    the following would create a request using the initial values,

    POST 'http://www.example.com/survey.cgi', [ select1 => 'Component_1_1', select1 => 'Component_1_2', select2 => 'Component_2_3', ];

    It's easy to see what you should provide by changing the POST to GET and submitting the form to a non existant URL using your web browser: (spacing added for readability)

    http://www.example.com/nonexistant.cgi ? select1=Component_1_1 & select1=Component_1_2 & select2=Component_2_3

    Update: It might be easier for you to build the request as follows:

    POST 'http://www.example.com/survey.cgi', [ ( map {; select1 => $_ } @select1_values ), ( map {; select2 => $_ } @select2_values ), ];
      thanks for your reply ,but the unquoted select1 select2 will generate syntax error . The Source code of the form webpage I want to query is written in php as follows
      ... <form name="geneCompareTwo" method="post" action="geneCompareTwo2.php" +> ... <select name="ontologies[]" multiple="yes" size="4"> <option selected value="All">All</option> <option value="biological_process">Biological Process</option> <option value="cellular_component">Cellular Component</option> <option value="molecular_function">Molecular Function</option> </select>
      if I want to simulate http query using lwp method as follows
      my $response=$browser->post($url,["ontologies[]" => "ALL"])
      it still doesn't work

        thanks for your reply ,but the unquoted select1 select2 will generate syntax error

        That's not true! Quoting of identifiers followed by "=>" is optional. See perlop and perldata.

        use strict; use warnings; use Data::Dumper qw( Dumper ); print Dumper [ select1 => 'Component_1_1', select1 => 'Component_1_2', select2 => 'Component_2_3', ];
        >perl 710263.pl $VAR1 = [ 'select1', 'Component_1_1', 'select1', 'Component_1_2', 'select2', 'Component_2_3' ];

        Note that ontologies[] is not an identifier, so you will have to quote that.

        it still doesn't work

        You've misspelled "All". If you still have problems after fixing that one, perhaps the server is expecting other fields you didn't show us or some cookies.

Re: how to post multiple select list through LWP::agent
by moritz (Cardinal) on Sep 09, 2008 at 21:36 UTC
      I tried that ,but without success.