Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

felipeduardo

web service php

Recommended Posts

Olá!

 

Vou descrever o projeto e depois meu problema...

a tarefa é criar um web service php (PHP5 rodando num servidor apache usando a classe NuSOAP), que na verdade ja esta pronto...

o web service fara a replicação de dados entre bases (MSSQL matriz e filial)

sera gerado um arquivo XML ou mais, so que esses arquivos gerados estao ficando em torno de 2 a 5 MB, o que pode deixar o processo lento

por serem arquivos de texto se ZIPados ficam bem leves, ai esta o problema pela aplicação DELPHI o arquivo chega tranqüilo...

 

 

//o registro do meu metodo
$server->register('getXML', 
array('usuario' => 'xsd:string', 'senha' => 'xsd:string'),  
array('return' => 'xsd:byte[]'),  'urn:webserver.dados', 'urn:webserver.dados#getXML',  'rpc',  'encoded',  
'Pegar o XML com os dados de replicação para o cliente.' );

function getXML ($usuario, $senha){

$byteArr = array();

$byteArr = file("teste.zip");

return $byteArr;

}

 

dessa forma ele devia enviar o arquivo de volta, mas so envia 6 bytes...

mudei as funções e so envia 6 bytes

 

 

function getXML ($usuario, $senha){

$byteArr = array();

$handle = fopen("teste.zip", "rb");

while (!feof($handle)) {
	$b = fread($handle, 1);
	array_push($byteArr, $B);
}

fclose($handle);

return $byteArr;

}

 

tentei depois de transformar o arquivo em array de bytes

fazer o processo contrario e salvar na minha maquina

e fico certo idêntico ao que eu carrego para enviar

 

 

não sei se uma configuração de servidor, protocolo de comunicação...

 

quem esta fazendo comunicação com o web service é um aplicativo delphi...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça um teste, deixe o retorno:

return $byteArr;
Assim:

return 'O Rato Roeu a Roupa do Rei de Roma ;)';

Veja agora o q retorna.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a tarefa é criar um web service php (PHP5 rodando num servidor apache usando a classe NuSOAP), que na verdade ja esta pronto...

 

Como está seu WSDL ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

a tarefa é criar um web service php (PHP5 rodando num servidor apache usando a classe NuSOAP), que na verdade ja esta pronto...

 

Como está seu WSDL ?

 

 

assim...

// inclusão do arquivo de classes NuSOAP 
require_once('modulos/classes/nusoap.php'); 

// criação de uma instância do servidor  
$server = new soap_server;  

// inicializa o suporte a WSDL 
$server->configureWSDL('wsXPert', 'urn:wsxpert.atxdados'); 
$server->wsdl->schemaTargetNamespace = 'urn:wsxpert.atxdados';

Compartilhar este post


Link para o post
Compartilhar em outros sites

// inicializa o suporte a WSDL 
$server->configureWSDL('wsXPert', 'urn:wsxpert.atxdados'); 
$server->wsdl->schemaTargetNamespace = 'urn:wsxpert.atxdados';

 

Não...

Isso é como o nuSoap vai gerar o WSDL, precisamos ver o WSDL gerado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

// inicializa o suporte a WSDL 
$server->configureWSDL('wsXPert', 'urn:wsxpert.atxdados'); 
$server->wsdl->schemaTargetNamespace = 'urn:wsxpert.atxdados';

 

Não...

Isso é como o nuSoap vai gerar o WSDL, precisamos ver o WSDL gerado.

 

acho que é isso neh?!?!

desculpa ai sou meio que por completo leigo no assunto... hehe

 

// inicializa o suporte a WSDL 
$server->configureWSDL('wsDados', 'urn:webserver.dados'); 
$server->wsdl->schemaTargetNamespace = 'urn:webserver.dados';

 

Name: getXML

Binding: wsDadosBinding

Endpoint: http://localhost/webserver/webserver.php

SoapAction: urn:webserver.dados#getXML

Style: rpc

Input:

use: encoded

namespace: urn:webserver.dados

encodingStyle: http://schemas.xmlsoap.org/soap/encoding/

message: getXMLRequest

parts:

usuario: xsd:string

senha: xsd:string

Output:

use: encoded

namespace: urn:webserver.dados

encodingStyle: http://schemas.xmlsoap.org/soap/encoding/

message: getXMLResponse

parts:

return: xsd:byte[]

Namespace: urn:webserver.dados

Transport: http://schemas.xmlsoap.org/soap/http

Documentation: Pegar o XML com os dados de replicação para o cliente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu sei e nem tem como eu disponibilizar isso, mas a WSDL é importanda sem problemas pelo delphi

tudo funciona corretamente mas o delphi so receber 6 bytes...

 

Bom, posso apostar que o problema está na descrição do seu serviço;

Verifique o schema do seu wsdl e revise o tipo do elemento de saída da operação getXML

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

eu sei e nem tem como eu disponibilizar isso, mas a WSDL é importanda sem problemas pelo delphi

tudo funciona corretamente mas o delphi so receber 6 bytes...

 

Bom, posso apostar que o problema está na descrição do seu serviço;

Verifique o schema do seu wsdl e revise o tipo do elemento de saída da operação getXML

 

 

http://www.xpid.com.br/webserver/webserver.php?wsdl

 

ai raça ajuda?!?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo...

 

<part name="return" type="xsd:byte[]"/>

 

Isso não é legal, o tipo deve ser um QNAME, tenta modificar para:

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:tns="urn:webserver.dados"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="urn:webserver.dados">
    
    <types>
        <xsd:schema targetNamespace="urn:webserver.dados">
            <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
            <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
            
            <xsd:complexType name="ArrayOfBytes">
                <xsd:complexContent>
                    <xsd:restriction base="SOAP-ENC:Array">
                        <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd:byte[]" />
                    </xsd:restriction>
                </xsd:complexContent>
            </xsd:complexType>
        </xsd:schema>
    </types>
    
    <message name="getXMLRequest">
        <part name="usuario" type="xsd:string" />
        <part name="senha" type="xsd:string" />
    </message>
    <message name="getXMLResponse">
        <part name="return" type="tns:ArrayOfBytes" />
    </message>
    
    <portType name="wsDadosPortType">
        <operation name="getXML">
            <input message="tns:getXMLRequest" />
            <output message="tns:getXMLResponse" />
        </operation>
    </portType>
    
    <binding name="wsDadosBinding" type="tns:wsDadosPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
        <operation name="getXML">
            <soap:operation soapAction="urn:webserver.dados#getXML" style="rpc" />
            <input>
                <soap:body use="encoded" namespace="urn:webserver.dados" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </input>
            <output>
                <soap:body use="encoded" namespace="urn:webserver.dados" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </output>
        </operation>
    </binding>
    
    <service name="wsDados">
        <port name="wsDadosPort" binding="tns:wsDadosBinding">
            <soap:address location="http://www.xpid.com.br/webserver/webserver.php" />
        </port>
    </service>
</definitions>

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao alterei como voce falou..

 

$server->wsdl->addComplexType(
'ArrayOfBytes',
'complexType',
'array',
'',
'SOAP-ENC:Array',
array(),
array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' =>
'xsd:byte[]')),
'xsd:byte'
);

 

e agora esta dando esse erro...

 

Array ( [faultcode] => Client [faultactor] => [faultstring] => error in msg parsing: XML error parsing SOAP payload on line 1: Invalid character [detail] => ) Falha

1
.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, duas coisas:

 

1. Evite fazer quotes sem necessidade, isso prejudica muito a leitura e inibe que outros possam te ajudar.

2. Tente rodar o code abaixo, SEM o nuSoap:

 

webserver.php

<?php
if ( isset( $_GET[ 'WSDL' ] ) ){
    readfile( 'server.wsdl' );
} else {
    class wsDados {
        public function getXML( $usuario , $senha ){
            $xml = file_get_contents( 'teste.zip' , FILE_BINARY );
            $ret = array();

            for ( $i = 0 , $t = strlen( $xml ) ; $i < $t ; $i++ ) $ret[] = ord( $xml{ $i } );

            return $ret;
        }
    }

    $server = new SoapServer( 'server.wsdl' , array(
        'trace'            => 1,
        'exceptions'    => 1,
        'style'            => SOAP_DOCUMENT,
        'use'            => SOAP_LITERAL,
        'soap_version'    => SOAP_1_1,
        'encoding'        => 'UTF-8'
    ) );

    $server->setClass( 'wsDados' );
    $server->handle();
}

server.wsdl

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
    name="wsDados"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="urn:webserver.dados"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="urn:webserver.dados">
    
    <wsdl:types>
        <xsd:schema targetNamespace="urn:webserver.dados">
            <xsd:element name="loginType">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="usuario" minOccurs="1" maxOccurs="1" type="xsd:string" />
                        <xsd:element name="senha"   minOccurs="1" maxOccurs="1" type="xsd:string" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="ArrayOfBytes">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="bytes" minOccurs="0" maxOccurs="unbounded" type="xsd:byte" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:schema>
    </wsdl:types>
    
    <wsdl:message name="getXMLRequest">
        <wsdl:part element="tns:loginType" name="login" />
    </wsdl:message>
    <wsdl:message name="getXMLResponse">
        <wsdl:part element="tns:ArrayOfBytes" name="ArrayOfBytes" />
    </wsdl:message>
    
    <wsdl:portType name="wsDados">
        <wsdl:operation name="getXML">
            <wsdl:input message="tns:getXMLRequest" />
            <wsdl:output message="tns:getXMLResponse" />
        </wsdl:operation>
    </wsdl:portType>
    
    <wsdl:binding name="wsDadosSOAP" type="tns:wsDados">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="getXML">
            <soap:operation soapAction="urn:webserver.dados/getXML" />
            <wsdl:input>
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" />
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    
    <wsdl:service name="wsDados">
        <wsdl:port binding="tns:wsDadosSOAP" name="wsDadosSOAP">
            <soap:address location="http://www.xpid.com.br/webserver/webserver.php" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Modifique suas definições no Delphi de RPC-Encoded para Document-Literal

 

Consumindo com o PHP:

 

$cliente = new SoapClient( 'http://www.xpid.com.br/webserver/webserver.php?WSDL' , array(
    'trace'            => 1,
    'exceptions'    => 1,
    'style'            => SOAP_DOCUMENT,
    'use'            => SOAP_LITERAL,
    'soap_version'    => SOAP_1_1,
    'encoding'        => 'UTF-8'
) );

$login = new stdClass();
$login->usuario = 'neto';
$login->senha = 'teste';

try {
    if ( $bytes =& $cliente->getXML( $login )->bytes ){
        print implode( '' , array_map( create_function( '$byte' , 'return chr( $byte );' ) , $bytes ) );
    }
} catch ( SoapFault $fault ){
    printf( 'Erro[ %s ]: %s' , $fault->getCode() , $fault->getMessage() );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao o arquivo webserver.php

eu deixo exatamente como voce me passou?

porq nao tenho acesso no servidor pra descomentar o a ext soap

e estou testando na minha maquina local mas nao esta dando certo

 

<SOAP-ENV:Envelope>
−<SOAP-ENV:Body>
−<SOAP-ENV:Fault>
<faultcode>WSDL</faultcode>
−<faultstring>
SOAP-ERROR: Parsing WSDL: Couldn't load from 'server.wsdl'
</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

alterei o server.wsdl para o meu endereço (caminho da aplicacao) mas tambem nada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.