2009-03-10 6 views
3

J'ai travaillé avec soap4r et essayé d'utiliser le SOAP :: Header :: SimpleHandler, j'essaye de l'obtenir pour mettre un en-tête personnalisé sur le message sortant, mais je ne peux pas m'entraîner comment obtenir d'inclure des attributs plutôt que comme sous-éléments:soap4r en-têtes personnalisés

class ServiceContext < SOAP::Header::SimpleHandler 
    NAMESPACE = "http://context.core.datamodel.fs.documentum.emc.com/" 
    def initialize() 
    super(XSD::QName.new(NAMESPACE, 'ServiceContext')) 
    XSD::QName.new(nil, "Identities") 
    end 

    def on_simple_outbound 
    username = "username" 
    password = "password" 
    docbase = "Test" 
    return {"Identities" => {"Username" => username, "Password" => password, "Docbase" => docbase}} 
    end 
end 

qui retourne:

<n1:ServiceContext xmlns:n1="http://context.core.datamodel.fs.documentum.emc.com/" 
     env:mustUnderstand="0"> 
     <n1:Identities> 
     <n1:Username>username</n1:Username> 
     <n1:Password>password</n1:Password> 
     <n1:Docbase>Test</n1:Docbase> 
     </n1:Identities> 
    </n1:ServiceContext> 

ce que je besoin de revenir est le suivant:

<ServiceContext xmlns="http://context.core.datamodel.fs.documentum.emc.com/"> 
     <Identities xsi:type="RepositoryIdentity" userName="_USER_" password="_PWD_" repositoryName="_DOCBASE_" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
    </ServiceContext> 

Toute aide est grandement appréciée.

Répondre

3

soap4r n'est pas très jolie. J'ai balancé autour du rdocs abit et il semble que la manière la plus simple de résoudre votre problème serait d'avoir la représentation de l'élément que vous voulez créer.

donc au lieu de

return {"Identities" => {"Username" => username, "Password" => password, "Docbase" => docbase}} 

essayer

%Q(<Identities xsi:type="RepositoryIdentity" userName="#{user}" password="#{password}" repositoryName="#{docbase}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>) 

en utilisant quelque chose comme constructeur, vous pouvez le rendre plus rubyish, mais essayer.

L'autre option consisterait à rechercher de nouvelles bibliothèques de savon. handsoap semble intéressant.