2015-07-23 6 views
1

Я использую ниже код для публикации данных JSON с использованием LWP :: useragent. Я хочу сохранить сеанс открытым и отправить два запроса, но кажется, что он не работает на Linux-машине (два POST-запроса отправляются в два сеанса вместо одного).LWP :: useragent keep_alive не работает

Любые предложения? спасибо заранее

#!/usr/bin/perl 

use warnings; 
use LWP::UserAgent; 
use HTTP::Request::Common; 

open (JSON, "json3.txt") or die "$!"; 
$raw_string1 = do{ local $/ = undef; <JSON>; 
}; 



my $req = HTTP::Request->new(POST => 'http://www.example.com'); 


$hdr1 = 'User-Agent'; 
$val1 = 'Java/1.7.0_45'; 

$hdr2 = 'Connection'; 
$val2 = 'keep-alive'; 

$hdr3 = 'Accept'; 
$val3 = 'application/json, application/*+json'; 

$hdr4 = 'Host'; 
$val4 = 'example.com'; 

$hdr5 = 'Content-Type'; 
$val5 = 'application/json;charset=UTF-8'; 


$req -> header($hdr3 => $val3); 
$req -> header($hdr5 => $val5); 
$req -> header($hdr1 => $val1); 
$req -> header($hdr4 => $val4); 
$req -> header($hdr2 => $val2); 



$req->content_type("application/json"); 

$req->content("$raw_string1"); 

my $ua = LWP::UserAgent->new(keep_alive => 1); 
$res = $ua->request($req); 
print $res->content; 
$res = $ua->request($req); 
print $res->content; 
+0

Когда вы используете параметр keep_alive, тогда настраивается только LWP :: ConnCache, который Get/устанавливает количество подключений, которое будет кэшироваться. Теперь, какую ошибку/ответ вы получаете при запуске этого скрипта? – sandeep

ответ

0

его разрешено ... это не было связано с закрытием сервера бэкэнд. Я думаю, что использовал старый perl (5.10) со старой версией fedora. Я развернул новый экземпляр CentOs и его работу над ним. спасибо

+0

отметьте это как ответ, если это решит вашу проблему –

1

Keep-Alive просто рекомендуя сервер не закрывает соединение TCP после запроса, потому что их будет больше запросов. Сервер не должен следовать рекомендациям, и на самом деле многие серверы не должны поддерживать низкое количество открытых TCP-соединений, которые все используют ресурсы в системе.

Кроме того, вы не должны явно указывать заголовок Connection и Host.

Я пробовал следующий упрощенный пример, и пакетный захват показывает, что keep alive работает, если сервер поддерживает его (LWP 6.05). Поддержка означает, что сервер держит соединение открытым и не устанавливает заголовок «Соединение: закрыть» и либо использует HTTP/1.1, либо использует HTTP/1.0 вместе с заголовком «Connection: keep-alive».

my $req = HTTP::Request->new(POST => 'http://www.example.com/'); 
$req->content_type("application/json"); 
$req->content("foo"); 

my $ua = LWP::UserAgent->new(keep_alive => 1); 
$res = $ua->request($req); 
print $res->content; 
$res = $ua->request($req); 
print $res->content; 
+0

Я проверил захват пакетов. это не сервер, который закрывает соединение, а клиент. – user2896215

+0

Я пробовал упрощенный пример, и он работает. Вы уверены, что сервер не отвечает «Connection: close» или выдает ответ HTTP/1.0 (который неявно определен Connection: close)? –

+0

его разрешено ... это произошло не из-за закрытия сервера, закрывающего соединение. Я думаю, что использовал старый perl (5.10) со старой версией fedora. Я развернул новый экземпляр CentOs и его работу над ним. благодаря! – user2896215

 Смежные вопросы

  • Нет связанных вопросов^_^