Perl HTTP-запрос типа «выстрелил-забыл»

Это не то же самое, что и фоновый/асинхронный HTTP-запрос.

Есть ли способ запустить HTTP-запрос PUT и не ждать ответа или определения успеха/неудачи?

Моя кодовая база однопоточная и однопроцессная.

Я открыт для исправления запроса LWP::UserAgent->, если это необходимо.


person Elle Fie    schedule 08.03.2020    source источник
comment
Нетрудно найти библиотеку, позволяющую выполнять запрос, не дожидаясь ответа, но они ожидают, что вы в конечном итоге соберете ответ. Почему вы не можете сделать это и просто отказаться от ответа?   -  person ikegami    schedule 08.03.2020


Ответы (2)


Вы можете просто отказаться от обработки ответа, когда поступят первые данные:

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $resp = $ua->put('http://example.com/', ':content_cb' => sub { die "break early" });
print $resp->as_string;

Вы также можете создать запрос, используя HTTP::Request-new('PUT',...)->as_string, создать сокет с помощью IO::Socket::IP->new(...) или (для https) IO::Socket::SSL->new(...) и отправить этот запрос через сокет, а затем оставить сокет открытым на некоторое время, выполняя другие действия в своей программе.

Но первый подход с ранним прорывом в :content_cb наверное проще. И в отличие от создания и отправки запроса самостоятельно, это гарантирует, что сервер, по крайней мере, начал обрабатывать ваш запрос, так как он начал отправлять ответ обратно.

person Steffen Ullrich    schedule 08.03.2020

Если вы открыты для альтернатив LWP, Mojo::UserAgent является неблокирующим пользователем. агент, который позволяет вам контролировать, как ответ обрабатывается циклом событий при использовании таким образом. Например, как описано в книге рецептов, вы можете изменить обработку поток ответов. Это можно использовать, чтобы просто игнорировать поток или сделать что-то еще.

person Grinnz    schedule 09.03.2020