NAME

WWW::MLite::Client - WWW::MLite REST Client base class

VIRSION

Version 1.00

SYNOPSIS

use WWW::MLite::Client;

my $client = new MDScore::Client(
        verbose         => 0, # 0 - off, 1 - on
        url             => "https://your.domain.name/path",
        timeout         => 180,
        format          => "auto", # xml, json, yaml, auto
        content_type    => "text/plain",
        sr_attrs        => {
            xml => [
                    { # For serialize
                        RootName   => "request",
                    },
                    { # For deserialize
                        ForceArray => 1,
                        ForceContent => 1,
                    }
                ],
            json => [
                    { # For serialize
                        utf8 => 0,
                        pretty => 1,
                        allow_nonref => 1,
                        allow_blessed => 1,
                    },
                    { # For deserialize
                        utf8 => 0,
                        allow_nonref => 1,
                        allow_blessed => 1,
                    },
                ],
        },
        no_check_redirect => 0,
        ua_opts => {
                agent                   => "MyClient/1.00",
                max_redirect            => 10,
                requests_redirectable   => ['GET','HEAD'],
                protocols_allowed       => ['http', 'https'],
            },
        headers => {
                'Cache-Control' => "no-cache",
                'Accept'        => "text/plain",
            },
    );

my $perl = $client->request( POST => "/api", "...data..." );
print STDERR $client->error unless $client->status;
print Dumper($perl) if defined($perl);

DESCRIPTION

WWW::MLite REST Client base class.

This module provides interaction between the REST server and the REST client

new

my $client = new MDScore::Client(
        verbose         => 0, # 0 - off, 1 - on
        url             => "https://your.domain.name/path",
        timeout         => 180,
        format          => "auto", # xml, json, yaml, auto
        content_type    => "text/plain",
        sr_attrs        => {
            xml => [
                    { # For serialize
                        RootName   => "request",
                    },
                    { # For deserialize
                        ForceArray => 1,
                        ForceContent => 1,
                    }
                ],
            json => [
                    { # For serialize
                        utf8 => 0,
                        pretty => 1,
                        allow_nonref => 1,
                        allow_blessed => 1,
                    },
                    { # For deserialize
                        utf8 => 0,
                        allow_nonref => 1,
                        allow_blessed => 1,
                    },
                ],
        },
        no_check_redirect => 0,
        ua_opts => {
                agent                   => "MyClient/1.00",
                max_redirect            => 10,
                requests_redirectable   => ['GET','HEAD'],
                protocols_allowed       => ['http', 'https'],
            },
        headers => {
                'Cache-Control' => "no-cache",
                'Accept'        => "text/plain",
            },
    );
content_type

Content type of request and response

Default: text/plain

format

Format name: xml, json, yaml, none or auto

Deserialization will be skipped if format not specified

headers

hash of headers for Agent

Default: { 'Cache-Control' => "no-cache" }

no_check_redirect

If set the no_check_redirect to true then the check for redirects will not be performed

sr_attrs

Hash of the attributes-array for request serialization and deserialization

For example:

{
    xml => [
            { # For serialize
                RootName   => "request",
            },
            { # For deserialize
                ForceArray => 1,
                ForceContent => 1,
            }
        ],
    json => [
            { # For serialize
                utf8 => 0,
                pretty => 1,
                allow_nonref => 1,
                allow_blessed => 1,
            },
            { # For deserialize
                utf8 => 0,
                allow_nonref => 1,
                allow_blessed => 1,
            },
}
timeout

Timeout for LWP requests, in seconds

Default: 180 seconds (5 mins)

ua_opts

Hash of LWP::UserAgent options

Default:

{
  agent                   => __PACKAGE__."/".$VERSION,
  max_redirect            => MAX_REDIRECT,
  requests_redirectable   => ['GET','HEAD'],
  protocols_allowed       => ['http', 'https'],
}
uri

URI object, that describes URL of the WEB Server. See url attribute

url

Full URL of the WEB Server, eg.: http://user:password@your.domain.name/path/to?foo=bar

verbose

Verbose mode. All debug-data are written to trace pool

Default: 0

cleanup

$client->cleanup;

Cleanup all variable data in object and returns client object. Returns the Client object

error

print $client->error;
$client->error( " ... error ... " );

Just returns error string if no argument; sets new error string and returns it if argument specified

req

my $request = $client->req;

Returns request object

See HTTP::Request

request

my $data = $client->request( GET => "/my/path?foo=bar" );
my $data = $client->request( GET => "/my/path?foo=bar", undef, sub { ... } );
my $data = $client->request( GET => "/my/path?foo=bar", sub { ... }, sub { ... } );
my $data = $client->request( POST => "/my/path", { foo => "bar" } );
my $data = $client->request( PUT => "/my/path", "...data..." );

Performs request and returns response data

First arg

HTTP Method:

HEAD, GET, POST, PUT, PATCH, DELETE and etc.

Default: GET

Second arg

Path and query string

Default: undef

Third arg

Data: undef, string, perl-structure for serialization or request callback function

Default: undef

Example for uploading:

my $file = "/path/to/filename";
$self->request(PUT => "/foo/bar/filename", sub {
    my $req = shift; # HTTP::Request object
    $req->header('Content-Type', 'application/octet-stream');
    if (-e $file and -f $file) {
        my $size = (-s $file) || 0;
        return 0 unless $size;
        my $fh;
        $req->content(sub {
            unless ($fh) {
                open($fh, "<", $file) or do {
                    $self->error(sprintf("Can't open file %s: %s", $file, $!));
                    return "";
                };
                binmode($fh);
            }
            my $buf = "";
            if (my $n = read($fh, $buf, 1024)) {
                return $buf;
            }
            close($fh);
            return "";
        });
        return $size;
    }
    return 0;
});
Fourth arg

Callback response function

Default: undef

Example for downloading:

my $expected_length;
my $bytes_received = 0;
my $res = $client->request(GET => "/path", undef, sub {
    my($chunk, $res) = @_;
    $bytes_received += length($chunk);
    unless (defined $expected_length) {
        $expected_length = $res->content_length || 0;
    }
    if ($expected_length) {
        printf STDERR "%d%% - ",
            100 * $bytes_received / $expected_length;
    }
    print STDERR "$bytes_received bytes received\n";
    # XXX Should really do something with the chunk itself
    # print $chunk;
});

See LWP::UserAgent

res

my $response = $client->res;

Returns response object

See HTTP::Response

serializer

my $serializer = $client->serializer;

Returns serializer object

status

my $status = $client->status;
my $status = $client->status( 1 );

Status accessor. Returns object status value. 0 - Error; 1 - Ok You also can set new status value

trace

my $trace = $client->trace;
$client->trace("New trace record");

Gets trace stack or pushes new trace record to trace stack

transaction

print $client->transaction;

Gets transaction string

HISTORY

See Changes file

TO DO

See TODO file

BUGS

* none noted

SEE ALSO

WWW::MLite, HTTP::Message, LWP

AUTHOR

Serż Minus (Sergey Lepenkov) http://www.serzik.com <abalama@cpan.org>

COPYRIGHT

Copyright (C) 1998-2019 D&D Corporation. All Rights Reserved

LICENSE

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

See LICENSE file and https://dev.perl.org/licenses/