2017-05-04 1 views
0

Il existe une page Web qui comprend un bouton dans le formulaire. En cliquant sur ce bouton, une requête POST est envoyée et un fichier CSV est téléchargé. J'essaye d'automatiser le processus de téléchargement de CSV en utilisant LWP :: UserAgent.Demande POST avec un type de contenu multipart/form-data pour télécharger un fichier

Je Chrome de remarquer les outils de développement que le Content-Type est multipart/form-data; boundary=---WebKitFormBoundary....

Toute idée de comment puis-je envoyer la Request Payload exacte des outils de développement qui est affiché?

Je fais généralement ci-dessous pour le type de contenu x-www-form-urlencoded. Mais je n'ai aucune idée de la façon de soumettre des données de formulaire en plusieurs parties.

my $ua = LWP::UserAgent->new; 
$ua->cookie_jar({ file => "cookie.txt", autosave => 1}); 


my $request = HTTP::Request->new('POST', $url); 

#copy the form_data from chrome developer tools 
my $form_data = 'key=val&key2=val2'; 

#the form_data is too big (and is in parts) in case of multipart content type 

$request->content($form_data); 
$request->header('Content-Type' => "application/x-www-form-urlencoded"); 
#I'll have to use `multipart/form-data; boundary=---WebKitFormBoundary....` 

#add some other headers like 'Origin', 'Host' and 'Referer' in similar manner 
#... 
#... 

push @{ $ua->requests_redirectable }, 'POST'; 

my $response = $ua->request($request); 

#Get the file 

Répondre

2

Jetez un oeil à l'entrée sur POST dans the documentation for HTTP::Request::Common

Vous pouvez générer une multipart/form-data demande (au lieu de application/x-www-form-urlencoded) en passant une valeur d'en-tête de pseudo Content_Type => 'form-data'

Il ressemblerait à ceci

my $response = $ua->post(
    $url, 
    Content_Type => 'form-data', 
    { 
     ...; # Hash of form key/value pairs 
    } 
);