Pergunta

estou usando PHP 5.2.10 E estou tentando consumir um serviço da web que retorna tipos de dados complexos usando o Extensão padrão de sabão.

O problema é que o SoapClient não preenche objetos que são aninhados em outros objetos / matriz de objetos. Um exemplo simplificado do que recebo quando chamo o método getutente, especificando "my_unique_id" como um parâmetro é:

stdClass Object
(
    [getUtenteReturn] => stdClass Object
        (
            [userName] => my_unique_id
            [fieldOne] => ...
            [fieldTwo] => ...
            [utilizzatore] => stdClass Object
                ( // This is EMPTY instead of containing a series of userName's
                )

        )

)

A parte relevante da descrição WDSL é:

<element name="getUtenteResponse">
  <complexType>
    <sequence>
      <element name="getUtenteReturn" type="tns1:Cliente"/>
    </sequence>
  </complexType>
</element>
...
<complexType name="Utilizzatore">
  <sequence>
    <element name="userName" nillable="true" type="xsd:string"/>
  </sequence>
</complexType>
...
<complexType name="Cliente">
  <complexContent>
    <extension base="tns1:Utilizzatore">
      <sequence> 
        <element name="fieldOne" nillable="true" type="xsd:string"/>
        <element name="fieldTwo" nillable="true" type="xsd:string"/>
        <element name="utilizzatore" nillable="true" type="impl:ArrayOf_tns1_Utilizzatore"/>
      </sequence>
    </extension>
  </complexContent>
</complexType>

O que eu descobri que não sou o único que está enfrentando esse problema. Em particular eu encontrei este comentário na documentação oficial do PHP e Esta outra entrada do fórum Para dar duas idéias diferentes sobre como abordar o problema, mas não consegui virar nenhum desses dois Ideias dentro de solução de trabalho: Parece que não entendo completamente a lógica por trás dos exemplos dados.

Eu ficaria grato se alguém pudesse me orientar nisso: algum código de trabalho em outro serviço da web seria bem -vindo, mas o que estou principalmente depois é realmente entender o problema e a lógica das soluções propostas (a faixa de peixe, não o peixe!) . :)

Foi útil?

Solução

Pergunta antiga, sem resposta. Recentemente, tropecei neste post, que explica o problema e fornece uma solução: Consumindo Soap ComplexType Service com PHP.

Outras dicas

Aqui estão meus pensamentos imediatos, desculpe, isso não é uma resposta adequada, apenas algumas idéias ...

Primeiro, você já tentou visualizar a solicitação SOAP (o envelope) enviada ao servidor SOAP? Parece que deve funcionar? Você pode ver onde está dando errado? Você está apenas recebendo um erro de volta, um SOAPFAULT, ou os dados errados, ou nada?

Segundo, você já tentou usar o SoapParam classe?

Finalmente, tenho certeza que você está fazendo isso direito, mas noto que o objeto que você está construindo tem nome de usuário e campo e Fieldwo todos lado a lado, mas seu WSDL mostra que FieldOne e FieldTwo fazem parte da classe Cliente (que nunca aparece no seu exemplo) enquanto o nome de usuário deve estar dentro da matriz Utilizzatore, então não deveria ser mais como:

stdClass Object
(
    [Cliente] => stdClass Object
        (
            [fieldOne] => ...
            [fieldTwo] => ...
            [utilizzatore] => stdClass Object
                ( // This is EMPTY instead of containing a series of userName's
                )

        )

)

A classe Soapclient é muito frustrante para mim, então não tome nada disso como uma crítica, porque só espero entendê -lo melhor, oferecendo idéias que possam ajudá -lo.

Mac, muito obrigado por suas respostas rápidas. Veja o que eu caí .. eu não olhei para isso antes. Portanto, quero compartilhar isto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top