Friday 21 December 2018

Soapui content transfer coding binary options


Estou em uma extremidade solta sobre como adicionar um anexo na minha solicitação SOAP. Temos que consumir um serviço web de terceiros, construído em java, que é a coisa mais complicada que já encontrei. Todos os outros serviços da Web que usamos, que exigem anexos, possuem um método ou propriedade para adicionar o anexo. Simples. No entanto, este não fornece esse método. Nós temos uma versão da mensagem SOAP juntos que é exatamente como queremos o XML, no entanto, é a parte MIME do arquivo que não podemos adicionar. Esta é a parte XML que podemos gerar e enviar, no entanto, é incorreto, pois precisamos de uma parte do MIME lá, como: Eu explorei a internet para obter respostas, mas apareciam em branco. Não parece haver muita documentação ao usar o WSE para isso. Devo salientar que o WSE é um requisito do lado do servidor, e não há nenhuma maneira de mudar a tecnologia para resolver esse problema. Há uma maneira que essas seções MIME podem ser adicionadas. EDIT: devo acrescentar que posso obter um documento XML de trabalho enviado através do SoapUI com anexos, mas não consigo encontrar uma maneira dentro do nosso código. Eu adicionei uma recompensa para tentar obter uma solução para esse problema. Se alguém tiver outras ideias, informe-me. EDITE novamente: eu sei que foi uma semana desde que eu consegui verificar as respostas aqui, mas enquanto alguns dão uma boa idéia para onde eu ainda estou desenhando um espaço em branco. A terrível documentação em torno de XopDocument e seus métodos é um grande ponto de fadiga, se alguém tiver algum exemplo de usar o SaveToXopPackage, eles poderiam fornecer porque isso está começando a ser grato, pediu 20 de dezembro 11 às 11:48 Bem, John, como chegar a uma solução Ao invés de dar uma volta fingindo que você sabe tudo. Neste cenário, para mim, é necessário WSE. Sem ele, nossos pedidos serão rejeitados. Eu não posso dizer ao fornecedor de terceiros como eles devem estar codificando, eu posso tentar, mas eles sempre foram a empresa menos útil do mundo para contornar. Então, enquanto a WSE não deve ser usada se você estiver criando seu próprio software, é um requisito nesta instância. Ndash anothershrubery 5 de janeiro 12 às 10:49 Tenho pouco a dizer sobre isso, exceto que espero que alguém tenha dito ao imperador que suas roupas são obsoletas. Além disso, se você pretende que o uso do WSE não é uma opção, então você nunca aprenderá a personalizar o WCF para fazer o que você precisa, apenas usando o software suportado. Ndash John Saunders 5 de janeiro 12 às 17:53 Eu acho que você pode ter algumas opções: 1) Use o MTOM. Isso parece encerrar automaticamente a mensagem de saída em blocos MIME. 2) A Microsoft realmente fornece suporte para gerar e ler XOP com mime através da classe XopDocument, da qual é o SoapEnvelope. No entanto, penso que esta abordagem pode exigir que você realize o envio da mensagem através de um HttpWebRequest. Este blog tem um exemplo de como implementar isso. A desvantagem é que isso requer muito código e configuração extra para funcionar corretamente. A solução ideal seria interceptar o código que executa a transmissão do envelope, mas não consegui localizar o local correto para isso na tubulação. Estou confiável Estou trabalhando exatamente no mesmo projeto que vocês. Esse pedido de sabão é um pouco familiar :-) Nós conseguimos a maior parte do caminho, mudando para WCF e basicamente codificando manualmente o objeto de solicitação (criando classes que combinam o formato de sabão e, em seguida, usando os atributos xmlelement para decorá-lo para que ele Parece o pedido de sabão. O arquivo em si é declarado como Byte () na classe Attachment e também decorado com o xmlelement). É o que o contrato do WCF e parte do modelo de dados se parece. O modelo de dados real tem um monte de classes extras (Área de Aplicação, Área de Dados, Trabalho, etc.), mas isso lhe dá o suficiente de como é estruturado. A peça importante é o Arquivo como Byte (). Aqui está em Vb. Em seguida, você obteve seu cliente do WCF, isso é praticamente o mesmo que todos os clientes do WCF. Finalmente, você obteve o app. config. Heres a magia porque estava dizendo ao WCF usar Mtom para enviar a mensagem. Isso levará o Byte () e o separará em uma seção MIME separada, substituindo-o por um XOP: Incluir. Tenho em atenção que, por enquanto, estou apenas enviando-o através do localhost para que eu possa ver o pedido usando o tcpTrace. Você pode google esse aplicativo, mas ele basicamente captura o pedido para que possamos ver como ele se parece. Eu configurei tcpTrace para ouvir na porta 84. Finalmente, heres a chamada real para o cliente WCF para fazer a solicitação. E heres o traço que obtivemos através do tcpTrace. Ele obteve a estrutura básica correta e conseguiu extrair os dados binários do xml e colocá-lo em uma seção MIME separada. Como mencionei anteriormente - ainda temos problemas. Existem algumas tags faltando no cabeçalho de sabão. Mas eu acho bem ser capaz de descobrir isso. O problema real é que o Content-ID NÃO ESTÁ em um formato que o nosso parceiro pode aceitar - eles esperam algo como lt1.a33c2d7e84634122705ebc71e53d95d4c2683d726ba54e14apache. org e está formatando-os como tempuri. org1634618782531246992. Isso faz com que o manipulador do serviço da Web falhe porque não sabe como ler os IDs de conteúdo escapados dentro da mensagem de sabão. Respondeu 7 de janeiro 12 às 0:23 Apenas notei sua edição para isso agora. Sim, parece o mesmo projeto. Infelizmente, sua solução não vai funcionar no nosso caso, pois estamos restritos ao uso do WSE e não do WCF. Confiança em VS 2005. É uma dor. Mas este é o resultado que eu procuro, mas preciso descobrir a solução na WSE. (No entanto, com o seu problema, você não pode configurar o Content-ID para qualquer coisa que quiser. Isso funciona dentro do SoapUI, quando você especifica o ID do conteúdo você mesmo e não confia na representação padrão. Meu endereço de e-mail, não funciona um, está no meu Se você quiser conversar ainda mais. Ndash anothershrubery 16 de janeiro 12 às 12:58 Como você diz que conseguiu trabalhar no SoapUI, eu pensaria que você pode simplesmente perguntar ao SoapUI para o XML gerado que enviou para que você saiba como deveria se parecer, então Modifique seu código para imitar isso. UPDATE: após o seu comentário e lendo as outras respostas com mais detalhes: a solução me parece enviar bytes diretamente, usando o HttpWebRequest como na resposta do ktsioliss. Em detalhes: Crie o seu SOAP XML (o exemplo que você deu ), Codifique isto para bytes em UTF8 (1) Crie uma seqüência de caracteres com o mimeboundary inicial (a parte em seu XML anterior), codifique para bytes em UTF8 (2) Crie os bytes para o segundo mimeboundary (a parte após o XML). Então, crie a string contendo --MIMEBOUNDARY etc. codifique para UTF8 bytes e anexar todos os bytes do seu arquivo test. gif (3) Anexar todos os bytes na ordem (2), (1) e (3) e enviá-lo através do fio. Não deveria fazer o truque Ok, então eu entendi que aceita os dados do arquivo no elemento ltgwm: Filegt. Isso é sem usar o XOP, então a solicitação agora se parece: quando passou para o SoapUI, isso funciona perfeitamente, no entanto, no código ele dá uma resposta, mas ele lança um erro dizendo que a resposta não é um XML bem formado. Com uma exceção interna do WSE1608: Nenhuma parte XOP estava localizada no fluxo para o índice de conteúdo especificado: ltrootpart36875c60-630c-4e23-9e74-f9a9c7547fc7example. jaxws. sungt Vou abrir uma nova pergunta a respeito, pois é tecnicamente diferente questão. Eu estou envolvido exatamente no mesmo projeto e eu tenho os mesmos problemas discutidos neste tópico Estou usando os aprimoramentos vb 2005 e WSE 3.0 e eu consegui funcionar mesmo que seja uma dor por enquanto. Ao escrever o conteúdo do arquivo diretamente na propriedade de arquivo, o anexo será aceito pelo parceiro. No meu caso, isso funciona para quase todas as transações, exceto PRAs. Aqui, a resposta é positiva e um AttachmentID será entregue, mas o anexo não aparece na transação. Aqui está um exemplo da seção de Anexos: Se eu configurar RequireMtom para o Serviço como True, eu recebo o seguinte erro: Das Prfix kann nicht von em starstandards. orgwebservices200510transport innerhalb desselben Startelementtags neu definiert werden. Por um lado, funciona, por outro lado, não tenho certeza se será enviado com elementos XOP. Respondeu em 17 de janeiro 12 às 12:46 Eu fiz uma discussão com os desenvolvedores de serviços web sobre colocar os dados diretamente no elemento ltFilegt e eles disseram que isso não está de acordo com suas especificações e eles exigem um elemento ltxop: Includegt. Veja stackoverflowquestions8805095hellip para uma descrição mais detalhada do problema que estamos tendo. Se quiser discutir mais fora daqui, veja meu perfil para o meu endereço de e-mail. Ndash anothershrubery 17 de janeiro às 12:59 Claro. Mas não consigo encontrar seu endereço de e-mail. Ndash Daniel Schlieckmann 17 jan 12 às 15:43 Se você não pode vê-lo sob a biografia, agora está na seção Sobre mim no meu perfil. Ndash anothershrubery 17 de janeiro 12 às 15:45 Obrigado. Já enviei um e-mail. Ndash Daniel Schlieckmann 18 de janeiro 12 às 15:24 Sua resposta 2017 Stack Exchange, IncUsando SOAP para enviar dados binários Nossas mensagens de exemplo até agora foram bastante pequenas, mas podemos facilmente imaginar querendo usar SOAP para enviar grandes bolhas binárias de dados. Por exemplo, considere um registro automatizado de seguro. Os agentes do registro151remote podem usar o software habilitado para SOAP para enviar novas reivindicações a um servidor central e parte dos dados associados a uma reivindicação podem ser imagens digitais registrando danos ou o ambiente em torno de um acidente. Uma vez que o XML can039t codifica diretamente dados binários de 8 bits reais no momento, uma maneira simples de fazer esse tipo de coisa pode ser usar o XML Schema type base64binary e codificar suas imagens como texto base64 dentro do XML: Esta técnica funciona, mas it039s não Particularmente eficiente em termos de largura de banda, e leva tempo de processamento para codificar e decodificar bytes de e para base64. O email vem usando o padrão MIME (Multipurpose Internet Mail Extensions) por algum tempo agora para fazer esse trabalho e o MIME permite a codificação de binário de 8 bits. MIME também é a base para alguns dos dados codificados utilizados em HTTP, pois o software HTTP geralmente pode lidar com o MIME, pode ser bom se houvesse uma maneira de integrar o protocolo SOAP com este padrão e uma maneira mais eficiente de enviar dados binários. SOAP com anexos e DIME No final de 2000, a HP e a Microsoft lançaram uma especificação chamada quotSOAP Messages with Attachments. quot. A especificação descreve uma maneira simples de usar a codificação multi-reto no SOAP 1.1 para referenciar peças de anexo codificadas em MIME. Nós não entraremos em muitos detalhes aqui se você quiser ler as especificações, você pode encontrá-lo em w3.org TR2000NOTE-SOAP-attachments-20001211. A ideia básica por trás do SOAP com Attachments (SwA) é que você usa o mesmo truque de HREF que você viu na quot QuotObject Graphs quot para inserir uma referência aos dados na mensagem SOAP em vez de codificá-la diretamente. No caso SwA, no entanto, você usa o índice de conteúdo (cid) da parte MIME que contém os dados que você está interessado como referência em vez da ID de algum XML. Assim, a mensagem codificada anteriormente seria algo como isto: Outra tecnologia chamada Direct Internet Message Encapsulation (DIME). Da Microsoft e da IBM, usaram uma técnica similar, exceto que a codificação on-the-wire era menor e mais eficiente do que o MIME. DIME foi submetido ao IETF em 2002, mas já perdeu o suporte de até mesmo seus autores originais. SwA e DIME são ótimas tecnologias, e eles fazem o trabalho, mas existem alguns problemas. O principal problema é que tanto SwA como DIME introduzem uma estrutura de dados que está explicitamente fora do domínio do modelo de dados XML. Em outras palavras, se um intermediário recebesse a mensagem MIME anterior e quis assinar ou criptografar digitalmente o corpo SOAP, seria necessário que as regras lhe dissessem como o conteúdo do anexo MIME estava relacionado ao envelope SOAP. Essas regras não foram formalizadas para o SwADIME. Portanto, as ferramentas e o software que funcionam com o modelo de dados XML precisam ser modificados para entender a estrutura de empacotamento SwADIME e ter uma maneira de acessar os dados incorporados nos anexos MIME. Diversos visionários de XML e Web service começaram a discutir a questão geral de mesclar o conteúdo binário com o modelo de dados XML. Como resultado, várias propostas estão agora a evoluir para resolver este problema de uma forma arquitectonicamente mais limpa. PASWA, MTOM e XOP Em abril de 2003, o quotProposed Infoset Addendum para SOAP With Attachmentsquot (PASWA) g document foi lançado por várias empresas, incluindo Microsoft, ATampT e SAP. O PASWA introduziu um modelo lógico para incluir conteúdo binário diretamente em uma base de dados SOAP. Fisicamente, as mensagens que o PASWA trata são quase idênticas aos nossos dois exemplos anteriores (a imagem codificada primeiro como base64 em linha com o XML e, em seguida, como um anexo MIME). A diferença está na forma como pensamos nos anexos. Em vez de pensar na imagem codificada MIME como uma entidade separada que é explicitamente referida no envelope SOAP, pensamos logicamente como se ainda estivesse em linha com o XML. Em outras palavras, a embalagem MIME é uma otimização, e as implementações precisam garantir que os processadores que examinam o modelo de dados SOAP para fins de criptografia ou assinatura ainda vejam os dados reais como se estivessem codificados em base64 no XML. Em julho de 2003, após uma longa série de conversas entre o Grupo de Protocolo XML e os apoiantes de PASWA, nasceu o Mecanismo de Otimização de Transmissão de Mensagens (MTOM) g, pertencente ao grupo XMLP. Reestruturou as idéias no PASWA em um recurso abstrato para melhor sincronizar com o modelo de extensibilidade SOAP 1.2 e, em seguida, ofereceu uma implementação desse recurso em HTTP. O mecanismo de serialização é chamado de empacotamento otimizado binário XML (XOP) g foi levado em conta a uma especificação separada para que ele também pudesse ser usado em contextos que não sejam SOAP. Por exemplo, modificamos ligeiramente a reivindicação de seguro anterior, aumentando o XML com um atributo de tipo de conteúdo (da especificação XOP) que nos informa o tipo de conteúdo MIME a ser usado ao serializar este conjunto de informações usando o XOP. Aqui a versão nova: uma versão do MTOMXOP da nossa reivindicação de seguro modificada parece assim: Essencialmente, isso é o mesmo no fio que a versão SwA, mas usa o elemento xop: Includegt em vez de apenas o atributo href. A diferença real é arquitetônica, pois imaginamos que ferramentas e APIs manipularão esta mensagem exatamente como se fosse um modelo de dados XML. O MTOM e o XOP estão a caminho do lançamento do Grupo de Trabalho do Protocolo XML em 2004, e continua a ser visto como eles serão aceitos pela comunidade de usuários mais ampla. O feedback precoce foi muito positivo, no entanto, e os autores deste livro estão por trás da idéia de um modelo de dados unificado para XML e conteúdo binário. SoapClient :: SoapClient Parâmetros URI do arquivo WSDL ou NULL se estiver trabalhando no modo WSDL. Durante o desenvolvimento, o armazenamento em cache do WSDL pode ser desabilitado pelo uso da configuração soap. wsdlcachettl php. ini, caso contrário as mudanças feitas no arquivo WSDL não terão efeito até que soap. wsdlcachettl esteja expirado. Uma série de opções. Se estiver trabalhando no modo WSDL, esse parâmetro é opcional. Se estiver trabalhando no modo WSDL, as opções de localização e uri devem ser definidas, onde a localização é o URL do servidor SOAP para enviar a solicitação e uri é o espaço para nome alvo do serviço SOAP. As opções de estilo e uso só funcionam no modo WSDL. No modo WSDL, eles vêm do arquivo WSDL. A opção soapversion deve ser uma SOAP11 ou SOAP12 para selecionar SOAP 1.1 ou 1.2, respectivamente. Se omitido, 1.1 é usado. Para a autenticação HTTP, as opções de login e senha podem ser usadas para fornecer credenciais. Para fazer uma conexão HTTP através de um servidor proxy, as opções proxyhost. porta proxy . Proxylogin e proxypassword também estão disponíveis. Para autenticação de certificado de cliente HTTPS use opções localcert e passphrase. Uma autenticação pode ser fornecida na opção de autenticação. O método de autenticação pode ser SOAPAUTHENTICATIONBASIC (padrão) ou SOAPAUTHENTICATIONDIGEST. A opção de compactação permite usar a compactação de pedidos e respostas HTTP SOAP. A opção de codificação define a codificação de caracteres internos. Esta opção não altera a codificação de solicitações SOAP (é sempre utf-8), mas converte strings nela. A opção de rastreio permite o rastreamento de solicitação para que as falhas possam ser retro-selecionadas. Este padrão é FALSE A opção classmap pode ser usada para mapear alguns tipos WSDL para classes PHP. Esta opção deve ser uma matriz com tipos WSDL como chaves e nomes de classes PHP como valores. A opção de exceção é um valor booleano que define se os erros de sabão lançam exceções do tipo SoapFault. A opção connectiontimeout define um tempo limite em segundos para a conexão com o serviço SOAP. Esta opção não define um tempo limite para serviços com respostas lentas. Para limitar o tempo de espera para que as chamadas terminem, a configuração defaultsockettimeout está disponível. A opção tipemap é uma matriz de mapeamentos de tipo. O mapeamento de tipos é uma matriz com as teclas typename. Typens (namespace URI), fromxml (retorno de chamada aceitando um parâmetro de string) e toxml (aceitação de chamada de retorno de um parâmetro de objeto). A opção cachewsdl é uma das WSDLCACHENONE. WSDLCACHEDISK. WSDLCACHEMEMORY ou WSDLCACHEBOTH. A opção useragent especifica seqüência para usar no cabeçalho do agente de usuário. A opção de recursos é uma máscara de bits de SOAPSINGLEELEMENTARRAYS. SOAPUSEXSIARRAYTYPE. SOAPWAITONEWAYCALLS. A opção keepalive é um valor booleano que define se deseja enviar o cabeçalho Connection: Keep-Alive ou Connection: close. A opção sslmethod é uma das SOAPSSLMETHODTLS. SOAPSSLMETHODSSLv2. SOAPSSLMETHODSSLv3 ou SOAPSSLMETHODSSLv23. ErrorsExceptions SoapClient :: SoapClient () irá gerar um erro EERROR se as opções de localização e uri aren039t forem fornecidas no modo não-WSDL. Uma exceção SoapFault será jogada se o URI wsdl não puder ser carregado. Cliente novo SoapClient (some. wsdl) cliente novo SoapClient (some. wsdl. Array (soapversion gt SOAP12)) cliente novo SoapClient (some. wsdl. Array (login gt somename, senha gt somepassword)) cliente novo SoapClient (some. wsdl. Array (proxyhost gt localhost, proxyport gt 8080)) cliente novo SoapClient (some. wsdl. Array (proxyhost gt localhost, proxyport gt 8080, proxylogin gt somename, proxypassword gt somepassword)) cliente novo SoapClient (some. wsdl. Array (localcert gt Certkey. pem)) cliente novo SoapClient (null. Array (localização gt localhostsoap. php, uri gt test-uri)) cliente novo SoapClient (null. Array (localização gt localhostsoap. php, uri gt test-uri, estilo gt SOAPDOCUMENT, Use gt SOAPLITERAL)) cliente novo SoapClient (some. wsdl. Array (compressão gt SOAPCOMPRESSIONACCEPT SOAPCOMPRESSIONGZIP)) cliente novo SoapClient (some. wsdl. Array (codificação gt ISO-8859-1)) classe MyBook public title autor público cliente novo SoapClient ( Books. wsdl. Array (classmap gt arr Ay (livro gt MyBook))) Notas de contribuições do usuário 56 notas Levou mais de uma semana para descobrir como implementar os cabeçalhos do WSSE (Web Service Security) no SOAP de PHP nativo. Não há muito recurso disponível sobre isso, então pensou em adicionar isso aqui para benefício comunitário. Passo 1: Crie duas classes para criar uma estrutura para cabeçalhos WSSE ltphp classe clsWSSEAuth privado Nome de usuário privado Senha construção de função (senha de nome de usuário) this - gt Nome de usuário nome de usuário esta - gt Senha senha classe clsWSSEToken privado Nome de usuário Configuração de função Token (innerVal) this - gt Nome de usuárioToken innerVal Gt Passo 2: Criar variáveis ​​de sabão para nome de usuário e senha Nome de usuário ltphp 1111 senha 1111 Verifique com seu provedor qual o espaço de nome de segurança que eles estão usando. StrWSSENS schemas. xmlsoap. orgws200207secext objSoapVarUser novo SoapVar (nome de usuário XSDSTRING. NULL. StrWSSENS. NULL. StrWSSENS) objSoapVarPass novo SoapVar (senha. XSDSTRING. NULL. StrWSSENS. NULL. StrWSSENS) gt Etapa 3: Criar objeto para a classe Auth e passar no sabão Var........................................................................................................................................ (ObjSoapVarWSSEAuth) gt Passo 6: Criar SoapVar fora do objeto da classe Token ltphp objSoapVarWSSEToken novo SoapVar (objWSSEToken. SOAPENCOBJECT. NULL. StrWSSENS. UsernameToken. StrWSSENS) gt Etapa 7: Criar SoapVar para Security nó ltphp objSoapVarHeaderVal novo SoapVar (objSoapVarWSSEToken. SOAPENCOBJECT. NULL. StrWSSENS. Security. StrWSSENS) gt Passo 8: Crie um objeto de cabeçalho de segurança soapvar ltphp ObjSoapVarWSSEHeader novo SoapHeader (strWSSENS. Segurança. ObjSoapVarHeaderVal. verdade. Abce) O terceiro parâmetro aqui faz o parâmetro mustUnderstand1 Forth gera actorabce gt Etapa 9: Criar objeto do Soap Client ltphp objClient novo SoapClient (WSDL. ArrOptions) gt Etapa 10: Definir cabeçalhos para o objeto soapclient ltphp objClient - gt setSoapHeaders (array (objSoapVarWSSEHeader)) gt Etapa 11 : Chamada final para método ltphp objResponse objClient - gt soapCall (strMethod. RequestPayloadString) gt Uma nota sobre valores booleanos que podem parecer óbvios na reflexão, mas podem ser um getcha para alguns: ver um exemplo de solicitação SOAP com ltSomeBooleanParamgttrueltSomeBooleanParamgt pode levá-lo a passar na string Verdadeiro ou falso como o parâmetro, que é incorreto - o método correto é usar tipos de dados booleanos. Ltphp client new SoapClient (wsdl. Options) method DoSomething Params New stdClass params - gt SomeBooleanParam TRUE cliente - gt método (params) simplificado pedido snippet seria ltSomeBooleanParamgttrueltSomeBooleanParamgt isso também será correto, mas não pelas razões certas: params - gt SomeBooleanParam true O método de cliente - gt (params) simplificado pedido snippet seria ltSomeBooleanParamgttrueltSomeBooleanParamgt é onde você pode estar se perguntando o que está acontecendo params - gt SomeBooleanParam falso cliente - gt método (params) simplificado requisição snippet seria ltSomeBooleanParamgttrueltSomeBooleanParamgt você precisa fazer isso em vez params - Gt SomeBooleanParam FALSE cliente - gt método (params) snippet de solicitação simplificado seria ltSomeBooleanParamgtfalseltSomeBooleanParamgt gt Espero que ajude se você precisa usar ws-security com um nonce e um timestamp, você pode usar isso: class WsseAuthHeader extends SoapHeader function construct (user. Pass ) criada Gmdate (Y-m-dTH: i: sZ) nonce mtrand () passdigest base64encode (pacote (H. sha1 (pacote (H. nonce). Pacote (a. Criado). Pacote (a. Pass)))) auth new stdClass () auth - gt Nome de usuário novo SoapVar (usuário. XSDSTRING. NULL. This - gt wssns. NULL. This - gt wssns) auth - gt Senha new SoapVar (pass. XSDSTRING. NULL. This - gt wssns. NULL. This - gt wssns) auth - gt Nonce new SoapVar (passdigest. XSDSTRING. NULL. This - gt wssns. NULL. This - gt wssns) auth - gt Criado o novo SoapVar (criado. XSDSTRING. NULL. This - gt wssns. NULL. This - gt wsuns) usernametoken new stdClass () usernametoken - gt Nome de usuárioToken novo SoapVar (auth. SOAPENCOBJECT. NULL. This - gt wssns. Nome de usuárioToken. This - gt wssns) securitysv new SoapVar (novo SoapVar (Usernametoken. SOAPENCOBJECT. NULL. This - gt wssns. UsernameToken. This - gt wssns), SOAPENCOBJECT. NULL. This - gt wssns. Security. This - gt wssns) pai. Construir (this - gt wssns. Security. Securitysv. True) e com o seu SoapClient do: ltphp client new SoapClient (hostpath) client - gt setSoapHeaders (Array (novo WsseAuthHeader (usuário. Pass)) gt funciona para mim. Com base em um post de stackoverlfow que só fez o nome de usuário e a senha, não o nonce eo timestamp. Parece haver um problema com a especificação de strings vazias para proxyhost e opções de proxyport nas versões recentes do PHP (de uma versão posterior a 5.2.9 e Igual ou anterior a 5.2.11). Fornecer valores de seqüência vazia para proxyhost e proxyport causa erros de tipo de host não encontrados: fornecer NULL ou FALSE funciona bem. Para qualquer um que tenha problemas com ArrayOfxsdstring e obtenha um erro semelhante ao Nenhum deserializador definido para a cadeia de tipo de matriz Tente usar o parâmetro de funções, ajuste para SOAPUSEXSIARRAYTYPE - isso garante que o deserializador correto seja usado. Por exemplo, ltphp client new SoapClient (some. wsdl. Array (recursos gt SOAPUSEXSIARRAYTYPE)) gt Observe que criar um cliente soap para um URL inválido (você faz o teste do que acontece, quando um serviço não está disponível, à direita) geralmente lança uma exceção que Pode ser pego com try..catch. No entanto, se o xdebug estiver ativo, você obterá um erro fatal, o que, obviamente, não pode ser detectado. Exceção do SoapFault: o cliente parece que não obtivemos nenhum documento XML no ltdocumentgt já foi mencionado para ocorrer quando seu servidor produz algo antes de ltxml. Gt tag. Para todos aqueles que têm problemas com isso e sem acesso ao código do servidor: É assim que faz um proxy que limpe as respostas para você ltphp Classe simples tirada de uma nota de James Ellis na página doRequest () da classe manual ProxyClient extends SoapClient Protegido cacheDocument public function construct (wsdl. Options) parent. Construir (opções wsdl.) SetCacheDocument () define o conteúdo do documento previamente armazenado em cache função pública SetCacheDocument (documento) this - gt cacheDocument document doRequest () substitui o SoapClient padrão para lidar com uma solicitação local função pública doRequest () retorna este - gt cacheDocument colocar isso Codificar em sua função ou onde quer que você tenha todas as variáveis ​​necessárias definir cliente novo SoapClient (wsdlurl. Settingsarray) void client - gt método (params) chamar isso para obter resposta do servidor responsetring cliente - gt getLastResponse () esta parte remove coisas start strpos (answerstring Ltxml) end strrpos (answerstring. Gt) answerstring substr (answerstring. Start. fin - start 1) obtenha seu proxy proxy proxy novo ProxyClient (wsdlurl. Settingsarray) e preenchê-lo com o proxy de resposta dos servidores - g SetCacheDocument (answerstring) andfinallytheresultis proxy O método "gt" (params) printr (e, finalmente, o mais elevado), isso permite que você veja o que é O método é o nome dos métodos, por exemplo. Metget Parâmetros de reprodução - parâmetros típicos para um método de sabão Usando um arquivo WSDL é o caminho a seguir, no entanto, para minha aplicação específica, a LOCALIZAÇÃO: PORT precisava ser dinâmico para que meus clientes SOAP pudessem chamar um serviço diferente baseado no Domínio do cliente. Se você estiver usando um WSDL, o SoapClient () requer uma URL direta para um URL real e não permite que use um arquivo PHP que emita o WSDL XML dinâmico em seu lugar. Então, acabei fazendo uma WSDL separada para cada possível serviço necessário e tive que mantê-los todos se a descrição do serviço mudou. Finalmente, depois de alguns brincadeiras, consegui criar uma página PHP com os cabeçalhos de Mime apropriados para que eu pudesse enganar SoapClient () para pensar que estava sendo passado um arquivo com uma extensão. wsdl. Cabeçalho (Content-Type: applicationxml charsetUTF-8) cabeçalho (Content-Disposition: attachment filenamefilename. wsdl) read in file handle fopen (wsdl. R) wsdlxml fread (handle. Filesize (wsdl)) fclose (handle) coloque o código aqui para Substitua url e porta no xml Agora, para que isso funcione, você não pode apenas chamar um caminho relativo para o arquivo. Eu acredito que ele precisa passar pelo Apache para definir corretamente os cabeçalhos do tipo mime, etc. Então você usaria um cheio. Endereço como o caminho para o arquivo wsdl. php. . Em algum lugar no seu código de cliente de sabão, o novo KnowapClient (wsdlloc. Clientparamarray) Outra maneira, talvez não tão limpa, de conseguir isso seria modificar seu arquivo. htaccess no diretório onde o arquivo WSDL existe para forçar arquivos. wsdl para executar o Mecanismo PHP. Adicione o seguinte ao seu. htaccess: AddType applicationx-httpd-php. php. wsdl Você pode colocar fragmentos de código PHP dinâmicos em seus arquivos. wsdl para alterar os valores que você precisa. Existem vantagens e desvantagens para cada solução. A solução Mime provavelmente impõe mais o sistema, pois deve ler o arquivo sempre que é feita uma solicitação de sabão. A solução htaccess torna-o assim que você precisa depender de um arquivo modificado. htaccess ou Apache conf. Talvez se você definir o soap. wsdlcacheenabled, usando iniset (), para 1 (padrão), o cache o criará para que ele não leia o arquivo toda vez que a solução Mime. Estou experimentando os mesmos problemas ao tentar carregar um WDSL fiel que é protegido pela autenticação HTTP básica, uma vez que os parâmetros de login e senha são usados ​​apenas para o pedido, mas não ao ler o arquivo wdsl. Eu apenas uso a seguinte solução ao baixar o arquivo xml para uma localização não protegida no meu servidor. Observe que isso não suporta qualquer tipo de cache. Classe ltphp SoapAuthClient extends SoapClient Uma vez que o pacote SOAP PHP não suporta autenticação básica, esta classe baixa o arquivo WDSL usando o pacote cURL e cria uma cópia local do wdsl em seu servidor. Certifique-se de fornecer o seguinte parâmetro adicional nas opções Array: wdsllocalcopy gt função verdadeira SoapAuthClient (wdsl. Options) if (isset (opções wdsllocalcopy) ampamp options wdsllocalcopy true ampamp isset (login de opções) ampamp isset (senha de opções)) arquivo md5 ( Uniqid ())..xml se ((fp fopen (este - gt cachedir. Arquivo. W)) false) throw new Exception (Não foi possível criar o arquivo WDSL local (. This - gt cachedir. File.)) Ch curlinit () credit (login de opções. :. opções de senha) curlsetopt (ch. CURLOPTURL. Wdsl) curlsetopt (ch. CURLOPTHTTPAUTH. CURLAUTHBASIC) curlsetopt (ch. CURLOPTUSERPWD. Credit) curlsetopt (ch. CURLOPTTIMEOUT. 15) curlsetopt (ch. CURLOPTFILE. Fp) se ((xml curlexec (Ch)) false) curlclose (ch) fclose (fp) unlink (this - gt cachedir. File) throw new Exception (curlerror (ch)) curlclose (ch) fclose (fp) wdsl this - gt cacheurl. Arquivo desmarcado (opções wdsllocalcopy) unset (opções wdslforcelocalcopy) echo wdsl parent. Construir (wdsl. Opções) desassociar (este - gt arquivo cachedir.) Gt Seguindo o conteúdo foi capturado no TcpMon: Solicitação feita por SoapUI Pro 3.0.2: POST tf6servicesxdsrepositoryb HTTP1.1 Aceitar-Codificação: gzip, deflate Tipo de Conteúdo: multipartrelated typeapplicationxopxml Começar start-infoapplicationsoapxml limite de ação ---- Part1728349551.1260534830078 MIME-Version: 1.0 User-Agent: Jakarta Commons-HttpClient3.1 Host: ihexds. nist. gov:9080 Content-Length: 13318 ------ Part1728349551. 1260534830078 Content-Type: applicationxopxml charsetUTF-8 typeapplicationsoapxml actionProvideAndRegisterDocumentSetRequest Content-Transfer-Encoding: 8bit Content-ID: ------ Part1728349551.1260534830078 Content-Type: textplain charsetus-ascii Content-Transfer-Encoding: 7bit Content-ID: Ltgt Este é um documento de depeches. Pedido feito pela ferramenta xdstest: POST tf6servicesxdsrepositoryb HTTP1.1 Content-Type: multipartrelated boundaryMIMEBoundaryurnuuid613A2BD2D99F1E6B5912 60534073176 typeapplicationxopxml startlt0.urn: uuid: 613A2BD2D99F1E6B591260534073177 apache. orggt iniciar-infoapplicationsoapxml actionurn: IHE: iti: 2007 rovideAndRegisterDocumentSet-b User-agent: Axis2 acolhimento: ihexds. nist. gov:9080 Transfer-Encoding: chunked 20f1 --MIMEBoundaryurnuuid613A2BD2D99F1E6B59126053407 3176 Content-Type: applicationxopxml charsetUTF-8 typeapplicationsoapxml Content-Transfer-Encoding: binary Content-ID: lt0.urn:uuid:613A2BD2D99F1E6B591260534073177apache. orggt --MIMEBoundaryurnuuid613A2BD2D99F1E6B59126053407 3176 Content - Type: textplain Content-Transfer-Encoding: binary Content-ID: lt1. urn:uuid:613A2BD2D99F1E6B591260534073366apache. or g gt This is my document. From where can i set Content-Transfer-Encoding as binary At the nist public registry, you can view the text document which is been sent as an attachment: I have also tried making Encode Attachments as true under TestRequest Properties. But its not working either. Obrigado pela ajuda

No comments:

Post a Comment