SAVON : order in HEADER

Witajcie,

Mam tak (mniej więcej) zdefiniowanego klienta:
headers_added = { “ns2:Params” => { “ns2:additionalId” => 123 } }

client = Savon.client(
  wsdl: "http://xxxxx",
  endpoint: "http://xxxx",
  namespaces: { "xmlns:tns" => "http://xxx", "xmlns:ns2" => "http://yyy" },
  strip_namespaces: true,
  logger: Rails.logger,
  log_level: :debug,
  log: true,
  pretty_print_xml: true,
  env_namespace: :soapenv,
  wsse_auth: [my_login, token],
  headers: headers_added
)

response = client.call(:my_action,  message: {} )


Chciałbym otrzymać nagłówek w takiej kolejności

<soapenv:Header>
  <wsse:Security 
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
     <wsse:UsernameToken wsu:Id="UsernameToken-B8BD668336752CDC8D14525371049501">
        <wsse:Username>User</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">cea81b50cdc35747675c65a29d7a3a75368c0b34522d366da24344b832b2999c12a429ce97d2b9d06cf027381a39826b3e2d681b16d5f1c1862f842090ea6902</wsse:Password>
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">VcYE1Y4QuQ74UWUPHQD+CQ==</wsse:Nonce>
        <wsu:Created>2016-01-11T18:31:44.949Z</wsu:Created>
     </wsse:UsernameToken>
  </wsse:Security>
  <ns2:extraParams>
     <ns2:additionalId>123</ns2:additionalId>
  </ns2:extraParams>
</soapenv:Header>

i nie mam pojęcia, jak zmusić Savon’a by mi właśnie tak zbudował kopertę, bo co bym nie robił, to sekcję

  <ns2:extraParams>
     <ns2:additionalId>123</ns2:additionalId>
  </ns2:extraParams>

ciągle wstawia mi na początek i permanentnie mam:

<soapenv:Header>
  <ns2:extraParams>
     <ns2:additionalId>123</ns2:additionalId>
  </ns2:extraParams>
  <wsse:Security 
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
     <wsse:UsernameToken wsu:Id="UsernameToken-B8BD668336752CDC8D14525371049501">
        <wsse:Username>User</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">cea81b50cdc35747675c65a29d7a3a75368c0b34522d366da24344b832b2999c12a429ce97d2b9d06cf027381a39826b3e2d681b16d5f1c1862f842090ea6902</wsse:Password>
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">VcYE1Y4QuQ74UWUPHQD+CQ==</wsse:Nonce>
        <wsu:Created>2016-01-11T18:31:44.949Z</wsu:Created>
     </wsse:UsernameToken>
  </wsse:Security>
</soapenv:Header>

A tak w ogóle, czy ktoś może potwierdzić lub zaprzeczyć, że dokumentacja SOAP wymaga, by elementy w nagłówku (HEADER ) MUSIAŁY BYĆ PODAWANE W ODPOWIEDNIEJ KOLEJNOŚCI?

<soapenv:Header>
  <ns2:extraParams>
     .....
  </ns2:extraParams>
  <wsse:Security 
   ....
  </wsse:Security>
</soapenv:Header>

a nie

<soapenv:Header>
  <wsse:Security 
   ....
  </wsse:Security>
  <ns2:extraParams>
     .....
  </ns2:extraParams>
</soapenv:Header>

?

Mówiąc krótko: “Czy serwis nie jest czasami spierd… skoro wymaga podania w tym nagłówku parametrów w takiej, a nie innej kolejności?”

P.S.
Tak na marginesie, to zawsze myślałem, że XML wymyślono właśnie po to, by informacje na tym samym poziomie drzewa pobierać w dowolnej kolejności. :wink:

Znajomy miał problem z kolejnością tych nagłówków. Okazało się, że technologia Microsoftu, która obsługiwała server, wymagała takiej, a nie innej kolejności.

Chyba miał też problemy, z otrzymaniem odpowiedniej kolejności. Nie pamiętam jak to rozwiązał, ale chyba bardzo ‘nieładnie’. Przed wysłaniem danych potraktował je chyba jak zwykły string i przestawił co należy w odpowiednei miejsce.

Właśnie obawiam się, że też zostanę zmuszony do tworzenia jakiejś “popeliny”, by móc korzystać z tego serwisu.
Póki co, próbuję ustalić, czy standard SOAP dopuszcza definiowanie parametrów w sekcji HEADER w dowolnej kolejności, czy też koniecznie narzuconej przez producenta serwisu.

P.S.
Mam o tyle lepiej od Twojego znajomego, że serwis jest w czasie tworzenia i mogę powiedzieć VETO, jeżeli będzie to rozwiązanie niezgodne ze standardem…ale to właśnie próbuję ustalić.

Z tego co mi wiadomo to to czy kolejność elementów w XML’u ma znaczenie i jest zdefiniowana w schema dokumentu z którym tenże dokument powinien być zgodny. Wiec jeżeli w schema masz xs:sequence to kolejność elementów ma jak najbardziej znaczenie.

Ma to znaczenie np. w przypadku strumieniowego przesyłania danego dokumentu, bo wtedy możesz zacząć przetwarzać dane pomimo braku posiadania całości dokumentu.

OK, ale czy sam nagłówek też warto przetwarzać pomimo braku pobrania go w całości?
Sądziłem, że sekcja SOAP:header jest dosyć specyficzna i przetwarzanie dokumentu winno się odbywać dopiero po pobraniu nagłówka w całości.
Mylę się?

Tak jak pisałem, sprawdź w schema, to będziesz widział.

Jeżeli w schema nagłówki są w bloku xs:sequence to znaczy że musisz je podać w kolejności takiej jak podaje schema. Server prawdopodobnie i tak nic strumieniowo nie przetwarza, ale zapewne przed przetworzeniem waliduje xml’a, jeżeli jest niezgodny ze schema, to zwyczajnie wywala błędem. Jeżeli masz wpływ na to jak to wygląda po stronie serwera, to może zwyczajnie wystarczy zamienić xs:sequence na xs:all i będzie grało.