Loading ...
Sorry, an error occurred while loading the content.

Re: Using SOAP to transfer XML document

Expand Messages
  • nonsolosoft
    Only with SOAP::Lite I ve been able to construnct a such complex SOAP Message without trouble (I ve tried also XML::Generator, XML::Simple, etc.). It s a such
    Message 1 of 8 , Nov 1, 2004
    View Source
    • 0 Attachment
      Only with SOAP::Lite I've been able to construnct a such complex SOAP
      Message without trouble (I've tried also XML::Generator, XML::Simple,
      etc.).
      It's a such pity not be able from SOAP::Lite to transfer that message,
      using SOAP::Lite as transfer instead of RPC.

      --- In soaplite@yahoogroups.com, "nonsolosoft" <nonsolosoft@d...> wrote:
      >
      > Hello,
      >
      > I've to comunicate with a SOAP server that has not defined any method,
      > or, to say it better, it has only a method and it doesn't accept any
      > SOAP message declaring that method.
      >
      > I've read about this kind of server:
      > http://www.perfectxml.com/wp/5091/5091_Chap03/css/5091_Chap03_32.htm
      >
      > I'm able now to construct using SOAP::Lite the right SOAP Message for
      > it, but I've not understood how to make the SOAP::Lite transfer without
      > it modifies the Message.
      >
      > Here there is the message:
      >
      > <?xml version="1.0" encoding="UTF-8"?>
      > <SBNMarc xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
      > schemaVersion="1.07"
      > xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
      > xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
      > xmlns:xsd="http://www.w3.org/1999/XMLSchema"
      > xsi:noNamespaceSchemaLocation="SBNMarcv107.xsd">
      > <SbnUser>
      > <Biblioteca xsi:type="xsd:string">EXXAMM</Biblioteca>
      > <UserId xsi:type="xsd:int">010047</UserId>
      > </SbnUser>
      > <SbnMessage>
      > <SbnRequest>
      > <Cerca tipoOrd="1" tipoOutput="000" maxRighe="15" numPrimo="1">
      > <CercaElementoAut>
      > <CercaDatiAut>
      > <tipoAuthority xsi:type="xsd:string">AU</tipoAuthority>
      > <canaliCercaDatiAut>
      > <T001 xsi:type="xsd:string">CFIV006324</T001>
      > </canaliCercaDatiAut>
      > </CercaDatiAut>
      > </CercaElementoAut>
      > </Cerca>
      > </SbnRequest>
      > </SbnMessage>
      > </SBNMarc>

      [...]

      Thank you in advance, \fer
    • nonsolosoft
      ... I was looking in the SOAP::Lite source code: in the envelope() there is: } elsif ($type eq freeform ) { SOAP::Trace::freeform(@parameters); $body =
      Message 2 of 8 , Nov 1, 2004
      View Source
      • 0 Attachment
        --- In soaplite@yahoogroups.com, "nonsolosoft" <nonsolosoft@d...> wrote:
        >
        > Only with SOAP::Lite I've been able to construnct a such complex SOAP
        > Message without trouble (I've tried also XML::Generator, XML::Simple,
        > etc.).
        > It's a such pity not be able from SOAP::Lite to transfer that message,
        > using SOAP::Lite as transfer instead of RPC.
        >

        I was looking in the SOAP::Lite source code:
        in the envelope()
        there is:

        } elsif ($type eq 'freeform') {
        SOAP::Trace::freeform(@parameters);
        $body = SOAP::Data->set_value(@parameters);
        } ...

        Where have I to specify 'freeform' to use this code?
        Shall it do what I need?


        Best regards, \fer
      • nonsolosoft
        Hello, the following program now makes the SOAP call and receives the answer. 1) Can I avoid to use LWP::UserAgent to send the $soap_request? 2) If SOAP::Lite
        Message 3 of 8 , Nov 6, 2004
        View Source
        • 0 Attachment
          Hello,

          the following program now makes the SOAP call and
          receives the answer.

          1) Can I avoid to use LWP::UserAgent to send the $soap_request?
          2) If SOAP::Lite is not able to send a such raw $soap_request,
          can I reinsert the $soap_response into SOAP::Lite to use
          its deserializer and other features?

          #!/usr/bin/perl

          use SOAP::Lite;
          use LWP::UserAgent;

          $var4 = SOAP::Data
          ->name('SBNMarc' => {
          'SbnUser'=> {
          Biblioteca => 'EXXAMM',
          UserId => '010047'
          },
          SbnMessage=> {
          SbnRequest => \SOAP::Data->name('Cerca'=>
          {
          CercaElementoAut => {
          CercaDatiAut => {
          tipoAuthority=>AU,

          canaliCercaDatiAut => {

          T001=>'CFIV006324'
          }
          }
          }
          } )->attr({maxRighe=>"15",
          numPrimo=>"1", tipoOrd=>"1", tipoOutput=\>"000"})
          }
          })->attr({'schemaVersion'=>"1.07",
          'xmlns:xsi'=>"http://www.w3.org/2001/XMLSchema-instance",
          'xsi:noNamespaceSchemaLocation'=>"SBNMarcv107.xsd"});



          $soap_request = SOAP::Lite->serializer->envelope(method=>'freeform',
          $var4);

          $soap_request =~ s/<freeform>// ;
          $soap_request =~ s!</freeform>!! ;


          my $ua = LWP::UserAgent->new();
          my $req = HTTP::Request->new(POST => $SBN::uri);
          $req->authorization_basic($SBN::login, $SBN::password);

          $req->content_type('text/xml');
          $req->content($soap_request);
          my $res = $ua->request($req);
          my $soap_response = $res->as_string;

          print $soap_response->content;






          Best regards, \fer
        • Duncan Cameron
          ... It doesn t have to be this complicated! Your top-level element, SBNMarc, is in effect the remote method to be invoked, and its child elements, Sbnuser
          Message 4 of 8 , Nov 6, 2004
          View Source
          • 0 Attachment
            On 2004-11-06 at 15:31:50 nonsolosoft wrote:

            >Hello,
            >
            >the following program now makes the SOAP call and
            >receives the answer.
            >
            >1) Can I avoid to use LWP::UserAgent to send the $soap_request?
            >2) If SOAP::Lite is not able to send a such raw $soap_request,
            >can I reinsert the $soap_response into SOAP::Lite to use
            >its deserializer and other features?
            >
            >#!/usr/bin/perl
            >
            >use SOAP::Lite;
            >use LWP::UserAgent;
            >
            >$var4 = SOAP::Data
            > ->name('SBNMarc' => {
            > 'SbnUser'=> {
            > Biblioteca => 'EXXAMM',
            > UserId => '010047'
            > },
            > SbnMessage=> {
            > SbnRequest => \SOAP::Data->name('Cerca'=>
            > {
            > CercaElementoAut => {
            > CercaDatiAut => {
            >
            >tipoAuthority=>AU,
            >
            >canaliCercaDatiAut => {
            >
            >T001=>'CFIV006324'
            > }
            > }
            > }
            > } )->attr({maxRighe=>"15",
            >numPrimo=>"1", tipoOrd=>"1", tipoOutput=\>"000"})
            > }
            > })->attr({'schemaVersion'=>"1.07",
            >'xmlns:xsi'=>"http://www.w3.org/2001/XMLSchema-instance",
            >'xsi:noNamespaceSchemaLocation'=>"SBNMarcv107.xsd"});
            >
            >$soap_request = SOAP::Lite->serializer->envelope(method=>'freeform',
            >$var4);
            >
            >$soap_request =~ s/<freeform>// ;
            >$soap_request =~ s!</freeform>!! ;
            >
            >my $ua = LWP::UserAgent->new();
            >my $req = HTTP::Request->new(POST => $SBN::uri);
            >$req->authorization_basic($SBN::login, $SBN::password);
            >
            >$req->content_type('text/xml');
            >$req->content($soap_request);
            >my $res = $ua->request($req);
            >my $soap_response = $res->as_string;
            >
            >print $soap_response->content;
            >
            It doesn't have to be this complicated!
            Your top-level element, SBNMarc, is in effect the 'remote method' to be
            invoked, and its child elements, Sbnuser and SbnMessage, are the
            parameters.
            So you can use SOAP::Lite directly

            my $user = SOAP::Data->name('SbnUser'=> {
            Biblioteca => 'EXXAMM',
            UserId => '010047'
            });
            my $message = SOAP::Data->name(SbnMessage => {
            SbnRequest => \SOAP::Data->name('Cerca'=> {
            CercaElementoAut => {
            CercaDatiAut => {
            tipoAuthority=>AU,canaliCercaDatiAut => {T001=>'CFIV006324'}
            }
            } )->attr({maxRighe=>"15",numPrimo=>"1", tipoOrd=> "1",
            tipoOutput=> "000"})
            });

            my $method = SOAP::Data
            ->name('SBNMarc')
            ->attr({
            'schemaVersion'=>"1.07",
            'xmlns:xsi'=>"http://www.w3.org/2001/XMLSchema-instance",
            'xsi:noNamespaceSchemaLocation'=>"SBNMarcv107.xsd"
            })
            ->uri('')
            ;
            my $s = SOAP::Lite
            ->proxy(...)
            ->uri(...)
            ;
            $s->call($method, $user, $message);

            The 'freeform' approach is undocumented and I don't see a way of using
            it at present. But you misunderstood how to use it, 'freeform' is
            actually the name of the serialiser method to be invoked:

            SOAP::Lite->serializer->freeform($var4);

            Regarding your question about deserialising, you can create a
            SOAP::Deserializer and give it any xml to be deserialised. See the docs
            for an example.

            Regards
            Duncan
          • nonsolosoft
            ... From WDSL SBNMarc was defined as element and not as method. Anyway, thank you: your solution works fine and I ll go on in this direction. Bye,
            Message 5 of 8 , Nov 6, 2004
            View Source
            • 0 Attachment
              --- In soaplite@yahoogroups.com, "Duncan Cameron"
              <duncan_cameron2002@y...> wrote:

              > It doesn't have to be this complicated!
              > Your top-level element, SBNMarc, is in effect the 'remote method' to be
              > invoked, and its child elements, Sbnuser and SbnMessage, are the
              > parameters.
              > So you can use SOAP::Lite directly

              From WDSL SBNMarc was defined as element and not as method.
              Anyway, thank you: your solution works fine and I'll go on
              in this direction.

              Bye, \fer
            • Byrne Reese
              Judging by the original message in this thread you are looking for a way to post an XML document to a URL, but you don t want all the SOAP Envelope, SOAP Body
              Message 6 of 8 , Nov 14, 2004
              View Source
              • 0 Attachment
                Judging by the original message in this thread you are looking for a way
                to post an XML document to a URL, but you don't want all the SOAP
                Envelope, SOAP Body stuff. Is that correct?

                If so, let me suggest you try using the following modules togethers:

                1) XML::Simple
                2) LWP

                XML::Simple allows you to contruct and parse XML documents using simple
                perl HASHs.

                LWP provides a way for you to send payloads over HTTP.

                If you need more help - let me know. Or if you DO want all the SOAP
                stuff, I can certainly help.

                Byrne

                nonsolosoft wrote:

                >
                > --- In soaplite@yahoogroups.com, "nonsolosoft" <nonsolosoft@d...> wrote:
                > >
                > > Only with SOAP::Lite I've been able to construnct a such complex SOAP
                > > Message without trouble (I've tried also XML::Generator, XML::Simple,
                > > etc.).
                > > It's a such pity not be able from SOAP::Lite to transfer that message,
                > > using SOAP::Lite as transfer instead of RPC.
                > >
                >
                > I was looking in the SOAP::Lite source code:
                > in the envelope()
                > there is:
                >
                > } elsif ($type eq 'freeform') {
                > SOAP::Trace::freeform(@parameters);
                > $body = SOAP::Data->set_value(@parameters);
                > } ...
                >
                > Where have I to specify 'freeform' to use this code?
                > Shall it do what I need?
                >
                >
                > Best regards, \fer
              • nonsolosoft
                ... way ... No, I need the SOAP Envelope, Body and so on. But the SOAP Server has not defined a valid method. Thank Duncan Cameron to have suggested me to use
                Message 7 of 8 , Nov 15, 2004
                View Source
                • 0 Attachment
                  --- In soaplite@yahoogroups.com, Byrne Reese <byrne@m...> wrote:
                  > Judging by the original message in this thread you are looking for a
                  way
                  > to post an XML document to a URL, but you don't want all the SOAP
                  > Envelope, SOAP Body stuff. Is that correct?

                  No, I need the SOAP Envelope, Body and so on.
                  But the SOAP Server has not defined a valid method.
                  Thank Duncan Cameron to have suggested me to use the outer XML element
                  as method; it works now.

                  Thank you Byrne Reese too.

                  Bye, \fer
                Your message has been successfully submitted and would be delivered to recipients shortly.