Search code examples
perlsoapsoaplite

Error 411 Length Required without a POST


Below is the code that I am using in a .PL file, I feel like the ENV that I create may be the issue here, but if I take that out I get a certificate error. I was wondering is there any fix around the 411 Length required error. I have found people talking about POST methods but, I am not using a POST, any help is appreciated. I got thrown into perl today, and I am trying my best just to get a connection to a web service.

#!perl -w

use SOAP::Lite;
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;


use Data::Dumper;
print Dumper(SOAP::Lite
-> proxy('mywebsite')
-> GetTicket()
-> result);

This is the new and working Code, I got an Authfail error though which is the next problem I will be working on.


Solution

  • Darch was correct, here is my fully functional working Code for any future users to look at.

    use strict;
    use warnings;
    
    # use ../ as lib location
    use File::Basename;
    use FindBin qw($RealBin);
    use lib dirname($RealBin);
    
    use SOAP::Lite;
    use Data::Dumper;
    
    $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0;
    
    my $URL = 'myURL';
    
    my $NameSpace = 'myNameSpace';
    
    # this is operation to execute, it could be TicketCreate, TicketUpdate, TicketGet, TicketSearch
    # or SessionCreate. and they must to be defined in the web service.
    my $Operation = 'GetTicket';
    
    # this variable is used to store all the parameters to be included on a request in XML format, each
    # operation has a determined set of mandatory and non mandatory parameters to work correctly, please
    # check OTRS Admin Manual in order to get the complete list.
    my $XMLData = '
    <UserLogin>myUser</UserLogin>
    <Password>myPassword</Password>
        <TicketID>1</TicketID>
    
    
    ';
    
    # ---
    
    # create a SOAP::Lite data structure from the provided XML data structure.
    my $SOAPData = SOAP::Data
    ->type( 'xml' => $XMLData );
    
    my $SOAPObject = SOAP::Lite
    ->uri($NameSpace)
    ->proxy($URL)
    ->$Operation($SOAPData);
    
    # check for a fault in the soap code.
    if ( $SOAPObject->fault ) {
    print $SOAPObject->faultcode, " ", $SOAPObject->faultstring, "\n";
    }
    
    # otherwise print the results.
    else {
    
    # get the XML response part from the SOAP message.
    my $XMLResponse = $SOAPObject->context()->transport()->proxy()->http_response()->content();
    
    # deserialize response (convert it into a perl structure).
    my $Deserialized = eval {
        SOAP::Deserializer->deserialize($XMLResponse);
    };
    
    # remove all the headers and other not needed parts of the SOAP message.
    my $Body = $Deserialized->body();
    
    # just output relevant data and no the operation name key (like TicketCreateResponse).
    for my $ResponseKey ( keys %{$Body} ) {
        print Dumper( $Body->{$ResponseKey} );
    }
    }