جلب المعلومات

لجلب اي صفحة ويب يمكن ان نستخدم مكتبة LWP::UserAgent لتقوم بعملية طلب و احضار الصفحة الالكترونية . ملاحظة : يمكن استخدام اي مكتبة اخرى مثلا: HTTP::Tiny, HTTP::Lite

في المثال ادناه سنقوم بتنفيذ طلب جلب باستخدام الامر GET

use LWP::UserAgent;

my $ua =
  LWP::UserAgent->new(agent => 'MyWebScaper/1.0 <http://example.com>');

my $response = $ua->get('http://example:3000/');

if ($response->is_success) {
    say $response->decoded_content;
} else {
    die $response->status_line;
}

بعد تنفيذ هذا الكود فسنتحصل على نسخة من الصفحة التي طلبناها اذا تمت العملية بنجاح. او في حالة فشل عملية الاتصال و تحميل الصفحة سيرجع لنا الكود رسالة خطأ

لنقم بمحاولة تنزيل صفحة غير موجودة على السيرفر:

use LWP::UserAgent;

my $ua =
  LWP::UserAgent->new(agent => 'MyWebScaper/1.0 <http://example.com>');

my $response = $ua->get('http://example:3000/not_found');

if ($response->is_success) {
    say $response->decoded_content;
} else {
    die $response->status_line;
}

هنا الخطأ سيقع في جهة السيرفر و سيقوم السيرفر بارجاع رسالة الخطأ، و لكن ماذا لو فشلت عملية الاتصال بالسيرفر اساسا؟

use LWP::UserAgent;

my $ua =
  LWP::UserAgent->new(agent => 'MyWebScaper/1.0 <http://example.com>');

my $response = $ua->get('http://unknown.server');

if ($response->is_success) {
    say $response->decoded_content;
} else {
    die $response->status_line;
}

في هذه الحالة سنتحصل على الخطأ 500. و لكن يبدو ان السيرفر يعمل و لكن بشكل غير صحيح و هذا خلاف الواقع. لكي نتعرف على مصدر الخطا هل هو خارجي او داخلي توفر مكتبة LWP رسالة تنبيهية خاصة، انظر الكود التالية: use LWP::UserAgent;

my $ua =
  LWP::UserAgent->new(agent => 'MyWebScaper/1.0 <http://example.com>');

my $response = $ua->get('http://unknown.server');

my $client_warning = $response->headers->header('Client-Warning');

if ($client_warning && $client_warning eq 'Internal response') {
    die 'Internal error: ' . $response->status_line;
} else {
    die 'Server error: ' . $response->status_line;
}

الان يمكننا ان نتأكد من ان الخطأ جاء من طرفنا.

تمرين

قم بتنزيل صفحة من السيرفر الافتراضي http://example:3000 و قم بطباعة حجمها بالبايتس

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;

...

say ...