펄링과 컬링

6094 단어 programmingperl
우리 대부분은 명령줄에서 HTTP 요청을 보내는 빠르고 쉬운 방법으로 curl을 알고 있을 것입니다.

그러나 그 도구는 curl 프로젝트의 진정한 금인 libcurl API에 대한 인터페이스일 뿐입니다. 이 API를 사용하면 모든 종류의 언어로 된 응용 프로그램에서 libcurl이 제공하는 놀라운 기능에 쉽게 액세스할 수 있습니다. 이 기사에서는 Perl에서 이 기능을 사용하는 방법에 대해 설명합니다.

빠른 예




use Net::Curl::Easier;

my $easy = Net::Curl::Easier->new(
    url => 'http://perl.org',
    followlocation => 1,
)->perform();

print $easy->head(), $easy->body();


방금 일어난 일에 대해 이야기합시다.

Net::Curl::EasierNet::Curl 의 "쉬운"인터페이스“easy” is what libcurl calls it! 주위의 얇은 래퍼로 Net::Curl의 거친 가장자리를 부드럽게 합니다.

(전체 공개: 나는 Net::Curl::Easier의 메인테이너입니다.)

적절한 URL을 제공하고 HTTP 리디렉션을 따르도록 지시한 "Easer"객체를 생성하면( followlocationHTTP’s Location header을 나타냄), Easer 객체에서 perform()를 실행합니다.

그런 다음 HTTP 응답 헤더와 본문을 인쇄하면 완료됩니다!

HTTP::Tiny를 사용하지 않는 이유는 무엇입니까?



물론. 글쎄요, 오류 보고입니다. 고려하다:

Net::Curl::Easier->new(
    url => 'http://blahblah',
)->perform();


이것을 실행하면 표준 오류로 인쇄된 Couldn't resolve host name를 볼 수 있습니다. 그러나 더 깊이 파고 들면 다음과 같은 멋진 것을 볼 수 있습니다.

use Net::Curl::Easier;
use Data::Dumper;

eval {
    Net::Curl::Easier->new(
        url => 'http://blahblah',
    )->perform();
};
print Dumper $@;


그 오류는 단순한 문자열이 아닙니다. 예외 객체입니다.

대규모 시스템에서는 특정 오류 유형을 다른 유형과 다르게 처리하고 싶은 경우가 많습니다. HTTP::Tiny의 오류는 문자열일 뿐이므로 HTTP::Tiny를 사용한 유형별 오류 처리에는 취약한 구문 분석 문자열이 수반됩니다. 누군가가 명확성을 위해 일부 오류 메시지의 단어를 변경하여 내 문자열 파서를 중단하면 어떻게 될까요?

Net::Curl을 사용하면 the curl project itself maintains 에 대한 문서인 특정 숫자 오류 코드를 찾을 수 있습니다. 이것은 훨씬 더 강력합니다.

신경쓰지마. 또 뭘 얻었어?



확인. 이건 어때:

my $easy = Net::Curl::Easier->new(
    username => 'hal',
    userpwd => 'itsasecret',
    url => 'imap://mail.example.com/INBOX/;UID=123',
)->perform();


방금 문의 ... 이메일받은 편지함?!?

Curl은 HTTP만 사용하는 것이 아닙니다. IMAP, LDAP, SCP 및 MQTT를 포함한 다른 많은 프로토콜을 사용합니다. curl이 지원하는 전체 프로토콜 목록을 보려면 curl --version 를 실행하십시오.

동시성



Curl은 동시 쿼리를 실행할 수도 있습니다. 그렇게 하려면 Net::Curl::Promiser 을 사용하는 것이 좋습니다. (전체 공개: 이 모듈도 유지 관리합니다.)

예를 들어 Mojolicious을 사용한다고 가정합니다.

use Net::Curl::Easier;
use Net::Curl::Promiser::Mojo;
use Mojo::Promise;

my $easy1 = Net::Curl::Easier->new(
    url => 'http://perl.org',
    followlocation => 1,
);

my $easy2 = Net::Curl::Easier->new(
    username => 'hal',
    userpwd => 'itsasecret',
    url => 'imap://mail.example.com/INBOX/;UID=123',
);

my $easy3 = Net::Curl::Easier->new(
    username => 'hal',
    userpwd => 'itsasecret',
    url => 'scp://tty.example.com/path/to/file',
);

my $promiser = Net::Curl::Promiser::Mojo->new();

Mojo::Promise->all_settled(
    $promiser->add_handle($easy1)->then( sub {
        print $easy1->head(), $easy1->body();
    } ),
    $promiser->add_handle($easy2)->then( sub {
        # ... whatever you want with the IMAP result
    } ),
    $promiser->add_handle($easy3)->then( sub {
        # ... whatever you want with the SCP result
    } ),
)->wait();


우리는 웹 페이지를 잡고, 편지함을 조회하고, SCP를 통해 파일을 다운로드했습니다. 이 모든 것을 동시에!

또한 이 메서드는 다른 Promise와 원활하게 연결됩니다. 따라서 기존Mojo::UserAgent 기반 코드가 있는 경우 다른 프로토콜에 대한 요청을 함께 추가할 수 있습니다.

Net::Curl::Promizer는 기본적으로 다음과 함께 작동합니다.
AnyEvent
IO::Async , 그것들이 당신에게 더 큰 관심이 있다면. 또한 사용자 지정select 기반 이벤트 루프를 위한 편의 레이어를 제공합니다.

기타 모듈



위에 제시된 모듈에 대한 몇 가지 대안:
  • AnyEvent::YACurl : 인터페이스를 약간 단순화하는 Net::Curl보다 새로운 라이브러리입니다. AnyEvent 을 사용한다고 가정하므로 AE를 사용하지 않는 경우 적합하지 않을 수 있습니다.
  • WWW::Curl : Net::Curl이 포크인 라이브러리.Net::Curl이 하는 일의 대부분을 수행할 수 있지만 libcurlMULTI_SOCKET interface에 대한 액세스가 부족합니다. 이는 동시 요청에 대한 curl의 내부select 기반 관리자보다 빠르고 유연합니다.
  • Net::Curl::Simple : Net::Curl의 원저자 래퍼.Net::Curl::Promiser 및 Net::Curl::Easer와 동일한 편의성을 제공하지만 약속 대신 콜백을 사용합니다.

  • 마무리 생각



    Curl은 위의 예에서 표면을 긁어낸 놀라운 기능을 제공합니다. 확인 해봐!

    좋은 웹페이지 즐겨찾기