Welcome to the "trac"-ing site of soap4r!
[soap4r] [httpclient] [openpgp4u] [pkcs1] [logger] [csv] [vtr]

Custom Mapping with MappingRegistry?

Q

My original class 'Person' is sent as '{http://www.ruby-lang.org/xmlns/ruby/type/custom}Person' but I want it to be sent as '{urn:custom}person'.

  driver = Driver.new(...)
  driver.add_method("getAddress", "person")
  person = Person.new("NaHi")
  response = driver.getAddress(person)

  =>

  <n1:getAddress>
    <person xmlns:n2="http://www.ruby-lang.org/xmlns/ruby/type/custom"
        xsi:type="n2:Person">
      <name xsi:type="xsd:string">NaHi</name>
    </person>
  </n1:getAddress>

A

Use MappingRegistry? (If you have WSDL, wsdl2ruby.rb generates this instead of you).

  map = SOAP::Mapping::Registry.new
  map.set(Person, ::SOAP::SOAPStruct,
    ::SOAP::Mapping::Registry::TypedStructFactory,
    {:type => XSD::QName.new("urn:custom", "person")})

  driver = Driver.new(...)
  driver.add_method("getAddress", "person")
  driver.mapping_registry = map

  person = Person.new("NaHi")
  response = driver.getAddress(person)

  =>

  <n1:getAddress>
    <person xmlns:n2="urn:custom" xsi:type="n2:person">
      <name xsi:type="xsd:string">NaHi</name>
    </person>
  </n1:getAddress>