Савон мыло проблема тела - PullRequest
2 голосов
/ 07 июня 2011

Я использую savon 0.9.2 и ruby ​​1.8.7. Я пытаюсь сделать запрос мыла сложного типа.

Мне нужно выяснить, как кодировать тело мыла для запроса типа ниже, используя ruby ​​и savon В основном один из сложных типов в запросе расширяет другой тип и также должен быть закодирован как массив.

Объект запроса мыла должен выглядеть следующим образом.

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:app="http://someurl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Header/>
<soapenv:Body>
<app:someMethod soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<xyzResReq xsi:type="java:xyzResReq" xmlns:java="java:com.xyz.request">
<somestring xsi:type="xsd:string">abc123</somestring>
<itinerary xsi:type="java1:xyzItinerary" xmlns:java1="java:com.xyz.domain">
<someList xsi:type="java2:List" soapenc:arrayType="xsd:anyType[]" xmlns:java2="java:language_builtins.util"/>
</itinerary>
</xyzResReq>
</app:someMethod>
</soapenv:Body>
</soapenv:Envelope> 

someList снова является сложным типом в форме схемы

<xsd:complexType name="someList">
<xsd:complexContent>
<xsd:extension base="stns:someBaseList">
<xsd:sequence>
<xsd:element maxOccurs="1" name="someElement" type="xsd:boolean" minOccurs="0" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

и someBaseList определены как

<xsd:complexType name="someBaseList"> 
<xsd:sequence>
<xsd:element maxOccurs="1" nillable="true" name="baseElement" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>

Как мне это сделать в savon.

1 Ответ

4 голосов
/ 07 июня 2011

Savon основан на предположении, что большинство запросов (XML) достаточно просты, чтобы их можно было абстрагировать как хэш.В этом сложном примере я бы предложил две альтернативы:

  1. Вместо хеша вы можете использовать любой объект Ruby (это не хеш) и отвечает на to_s.Таким образом, вы можете создать объект (или иерархию объектов) с помощью метода to_s, создающего XML через что-то вроде Builder , и передать его Savon::SOAP::XML#body=.

    class SomeXML
      def self.to_s
        "<some>xml</some>"
      end
    end
    
    client.request :some_action do
      soap.body = SomeXML
    end
    
  2. Вы также можете использовать Savon::SOAP::XML#xml, который возвращает экземпляр Builder для данного блока для создания XML «на лету».

    client.request :some_action do
      soap.xml do |xml|
        xml.person { |b| b.name("Jim"); b.phone("555-1234") }
      end
    end
    

Надеюсь, что это поможет!Также обратите внимание на новое руководство Savon .

...