Forum: Ruby SOAP / EncodingStyle

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
5b2bde5812466012d9dde870c258254f?d=identicon&s=25 fabienpenso (Guest)
on 2005-11-25 11:55
(Received via mailing list)
Hi.

I've been trying to do something with SOAP for hours with no luck. I
need to get a request that looks like :

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
 <ns1:getEligibilite xmlns:ns1="urn:eligibilite">
  <nd xsi:type="xsd:string"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">foobar<...
  <offre xmlns:ns2="http://schemas.xmlsoap.org/soap/encoding/"
xsi:type="ns2:Array"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
ns2:arrayType="xsd:int[15]">
    <item xsi:type="xsd:int">101</item>
    ...

and I get :

<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <env:Body>
    <n1:getEligibilite xmlns:n1="urn:eligibilite"
        env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <nd xsi:type="xsd:string">foobar</nd>
      <offre n2:arrayType="n1:int[3]"
          xmlns:n2="http://schemas.xmlsoap.org/soap/encoding/"
          xsi:type="n2:Array">
        <item xsi:type="xsd:int">101</item>
 ...

Note the encodingStyle specified in the n1 part of the XML, and not in
the nd part. The server gives me an error, and I beleive because of it.
The code currently looks like :

    106      map = SOAP::Mapping::Registry.new
    107      map.set(IntArray, SOAP::SOAPArray,
    108              SOAP::Mapping::Registry::TypedArrayFactory,
    109              { :type => XSD::QName.new('urn:eligibilite',
'int') })
    110
    111      # On met le mapper
    112      soap.mapping_registry = map
    113      soap.default_encodingstyle =
SOAP::EncodingStyle::SOAPHandler::Namespace
    114
    115      #soapObj = SOAP::Marshal.marshal( IntArray[ 101, 102, 103
], map )
    116
    117      soap.getEligibilite("foobar", IntArray[ 101, 102, 103
],"","something")


I've already spent hours on that soap part just to find documentation
to be able to send an Array of int[] ... Anyone has a
hint/documentation how I could fix my request and move on ? :)

Thanks.
C4ec160c6223ee24609cbd07fd922be5?d=identicon&s=25 nakahiro (Guest)
on 2005-11-26 14:33
(Received via mailing list)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

Fabien Penso wrote:
> Note the encodingStyle specified in the n1 part of the XML, and not in
> the nd part. The server gives me an error, and I beleive because of it.
> The code currently looks like :

I think the cause of the problem is that you are sending
arrayType="{urn:eligibilite}int[]", not
arrayType="{http://www.w3.org/2001/XMLSchema}:int[]".

>     106      map = SOAP::Mapping::Registry.new
>     107      map.set(IntArray, SOAP::SOAPArray,
>     108              SOAP::Mapping::Registry::TypedArrayFactory,
>     109              { :type => XSD::QName.new('urn:eligibilite',
> 'int') })

It should be { :type => XSD::XSDInt::Type } here.

0% cat intarray.rb
require 'soap/marshal'
include SOAP::Mapping

class IntArray < Array; end

map = Registry.new
map.set(IntArray, SOAP::SOAPArray, Registry::TypedArrayFactory,
  { :type => XSD::QName.new('urn:eligibilite', 'int') })
puts SOAP::Marshal.marshal(IntArray[1, 2, 3], map)

puts

map2 = Registry.new
map2.set(IntArray, SOAP::SOAPArray, Registry::TypedArrayFactory,
  { :type => XSD::XSDInt::Type })
puts SOAP::Marshal.marshal(IntArray[1, 2, 3], map2)

0% ruby intarray.rb
<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <env:Body>
    <IntArray xmlns:n1="http://schemas.xmlsoap.org/soap/encoding/"
        xmlns:n2="urn:eligibilite"
        xsi:type="n1:Array"
        n1:arrayType="n2:int[3]"
        env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <item xsi:type="xsd:int">1</item>
      <item xsi:type="xsd:int">2</item>
      <item xsi:type="xsd:int">3</item>
    </IntArray>
  </env:Body>
</env:Envelope>

<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <env:Body>
    <IntArray xmlns:n1="http://schemas.xmlsoap.org/soap/encoding/"
        xsi:type="n1:Array"
        n1:arrayType="xsd:int[3]"
        env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <item>1</item>
      <item>2</item>
      <item>3</item>
    </IntArray>
  </env:Body>
</env:Envelope>

Please tell me if it won't work.

Regards,
// NaHi
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (Cygwin)

iD8DBQFDiGLnf6b33ts2dPkRAp+gAKCQ/Kz7f/t8jVOEqLW7qWKD+z9AUACffmtZ
DlLKHg5mGYWFRj85g+dpp48=
=G0EH
-----END PGP SIGNATURE-----
5b2bde5812466012d9dde870c258254f?d=identicon&s=25 fabienpenso (Guest)
on 2005-11-28 15:45
(Received via mailing list)
Hi.

Works like a charm. Thanks !
This topic is locked and can not be replied to.