Páginas filhas
  • Limitações do client em AdvPL

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Comentário: Migration of unmigrated content due to installation of a new plugin
Composition Setup
import.css=/download/attachments/6062824/tecnologia.css
Portuguese
Pagetitle
Limitações do client em AdvPL
Limitações do client em AdvPL

Limitações do client em AdvPL

O client de Web Services em AdvPL possui as seguintes limitações:

Tratamento de simpleType

O client em AdvPL considera simpleType sempre tendo restriction e enumeration, as outras estruturas possíveis (list e union) não são suportadas. As opções dentro de restriction, mesmo enumeration, não são validadas ao definir o valor, mas sim inseridas diretamente no XML de envio.

Tratamento de complexType

Não é possível declarar complexType dentro de complexType, como no exemplo abaixo:

Bloco de código
<s:element name="ConsultarTarifasRequest">
  <s:complexType>
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="IdClienteResponsavel" type="s:int"/>
      <s:element minOccurs="0" maxOccurs="unbounded" name="Pracas">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="IdPraca" type="s:integer"/>
            <s:element minOccurs="0" maxOccurs="1" name="IDPracaAuxiliar" type="s:string"/>
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:sequence>
  </s:complexType>
</s:element>

Para resolver essa situação, deve-se declarar cada complexType no nível abaixo de schema e usá-los no type dos elementos, como no exemplo abaixo:

Bloco de código
<s:complexType name="PracaType">
  <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="IdPraca" type="s:integer"/>
    <s:element minOccurs="0" maxOccurs="1" name="IDPracaAuxiliar" type="s:string"/>
  </s:sequence>
</s:complexType>
<s:element name="ConsultarTarifasRequest">
  <s:complexType>
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="IdClienteResponsavel" type="s:int"/>
      <s:element minOccurs="0" maxOccurs="unbounded" name="Pracas" type="tns:PracaType" />
    </s:sequence>
  </s:complexType>
</s:element>

Prefixos de namespace

Os prefixos usados para as tags SOAP devem ser somente soap ou soap12; já os prefixos para as tags referentes a WSDL e schema são desprezados.

Protocolos de transporte não SOAP

Não são aceitos outros protocolos de envio de comando que não sejam SOAP, como HTTP ou SMTP, por exemplo.

Service Port

Só é aceito uma URL para envio do comando SOAP, não sendo possível declarar, por exemplo, uma URL para cada versão de SOAP. Os ports cujos bindings usam protocolos não SOAP são ignorados e se houver mais de um port para SOAP, será utilizado o primeiro declarado.

Para o exemplo abaixo:

Bloco de código
<wsdl:service name="Weather">
  <wsdl:port name="WeatherHttpPost" binding="tns:WeatherHttpPost">
    <http:address location="http://wsf.cdyne.com/WeatherWS/Weather1.asmx" />
  </wsdl:port>
  <wsdl:port name="WeatherHttpGet" binding="tns:WeatherHttpGet">
    <http:address location="http://wsf.cdyne.com/WeatherWS/Weather2.asmx" />
  </wsdl:port>
  <wsdl:port name="WeatherSoap12" binding="tns:WeatherSoap12">
    <soap12:address location="http://wsf.cdyne.com/WeatherWS/Weather3.asmx" />
  </wsdl:port>
  <wsdl:port name="WeatherSoap" binding="tns:WeatherSoap">
    <soap:address location="http://wsf.cdyne.com/WeatherWS/Weather4.asmx" />
  </wsdl:port>
</wsdl:service>

os ports WeatherHttpPost e WeatherHttpGet serão ignorados por não utilizarem SOAP e o port selecionado será WeatherSoap12, por ser o primeiro encontrado.

Múltiplos schemas

O client em AdvPL trata múltiplos schemas declarados dentro de types sem considerar o namespace, tratando todos como sendo do mesmo namespace. Logo, se for declarado um complexType em um schema com um namespace e ao utilizá-lo for passado por acidente outro namespace, não haverá problema, pois o namespace não é considerado. Caso um elemento ou tipo seja declarado com o mesmo nome em schemas diferentes, prevalecerá o último declarado.

Para o exemplo abaixo:

Bloco de código
...
<s:schema targetNamespace="http://microsoft.com/wsdl/types/" >
  <s:complexType name="guid">
    <s:element name="NAME1" type="s:string" />
  </s:complexType>
</s:schema>
<s:schema targetNamespace="http://www.totvs.com/types" >
  <s:complexType name="guid">
    <s:element name="NAME2" type="s:string" />
  </s:complexType>
</s:schema>
...

o tipo guid será o que possui o elemento de nome "NAME2".

Alternativa de contorno para as limitações

Caso um WSDL tenha alguma das limitações acima descritas, é possível salvar o arquivo no RootPath do Application Server e alterá-lo lá para poder gerar o client. Ao gerar client WSDL em AdvPL, ao invés de informar a URL, será informado um caminho de arquivo no server, como na imagem abaixo:

Dessa forma é possível gerar o client em AdvPL sem alterar o WSDL publicado externamente, caso haja a necessidade de algum ajuste.