2017-05-02 7 views
-2

Ich habe ein Problem, wo ich CURL innerhalb eines Perl-Skript verwenden, um eine HTTP-Anfrage auszuführen. Ich glaube, mein Problem bezieht sich auf Sonderzeichen in der URL-Zeichenfolge, aber ich kann nicht herausfinden, wie es funktioniert.Perl-URL-Codierung mit Curl

Ich kann bestätigen, dass die URL korrekt ist, da ich es von meinem Browser aus ausführen kann.

Mein Perl-Skript ist

#!/usr/bin/perl 
use strict; 
use warnings; 

$url = "http://machine/callResync?start=2017-02-01 00.00.00.000&end=2017-02-01 23.23.999"; 

system "curl $url 

Es schlägt fehl, wenn es das erste Leerzeichen erreicht. Ich bin müde, um mit% 20 zu entkommen.

Danach habe ich in% 26, um die & zu entkommen, aber dann bekomme ich ein anderes Problem. Ich habe eine Reihe von verschiedenen Kombinationen müde, aber es scheitert immer wieder.

Jede Idee ist.

+1

Warum Sie nicht über ein Perl-Modul wie verwenden: [WWW: Kräuseln] (http://search.cpan.org/~szbalint/WWW-Curl-4.17/lib /WWW/Curl.pm) anstelle eines Systemaufrufs – Jens

+2

Sie müssen das '&' nicht verlassen. Das ist Teil der URL. – simbabque

+0

Übergeben Sie die Argumente an "system" mit einem Array. – ceving

Antwort

1

Verwenden Sie das URI Modul korrekt eine URL zu bauen, und anstatt Beschuss Sie eine Perl-Bibliothek wie LWP::Simple verwenden sollten, sich kräuseln aus auf die Seite zuzugreifen

Der Nachteil LWP::Simple ist, dass es zu einfach sein kann insofern, als es keine Diagnose liefert, wenn die Transaktion fehlschlägt. Wenn Sie finden, dass Sie etwas komplizierteres brauchen, dann sollten Sie sich HTTP::Tiny, LWP::UserAgent oder Mojo::UserAgent ansehen. Wenn Sie mit diesen der Hilfe benötigen, dann wenden Sie sich bitte

use strict; 
use warnings 'all'; 

use URI; 
use LWP::Simple 'get'; 

my $url = URI->new('http://machine/callResync'); 
$url->query_form(
    start => '2017-02-01 00.00.00.000', 
    end => '2017-02-01 23.23.999', 
); 

my $content = get($url) or die "Failed to access URL"; 
+0

Danke Borodin, das hat perfekt funktioniert. – teamerMan

0

Problem Nummer 1: verwenden Sie eine ungültige URL. Leerzeichen können nicht in URLs angezeigt werden.

my $url = "http://machine/callResync?start=2017-02-01%2000.00.00.000&end=2017-02-01%2023.23.999"; 

Problem Nummer 2: Shell Injektionsfehler. Sie haben Ihren Shell-Befehl nicht korrekt erstellt.

system('curl', $url); 

oder

use String::ShellQuote qw(shell_quote); 

my $cmd = shell_quote('curl', $url); 
system($cmd);