DISCUSSÃO SOBRE A MACRO SC_WEBSERVICE SC 8.1

Colegas,

Participei do seminário a respeito da macro sc_webservice, mas confesso que sua utilização ainda é confusa para mim:

Criei uma blank (Test_Servidor_Soap), cujo o evento onExecute tem o seguinte código:

sc_include_library("prj", "MinhaClasse", "minhaclasse.class.php", true, true);
	
$url = "http://http://192.168.153.130/sc/8/app/webservice/Test_Servidor_Soap/";
	
$options = array('uri' => $url);
$server = new SoapServer("wsdl", $options);
$server->setClass('MinhaClasse');
$server->handle();

Biblioteca (novo): MinhaClasse:

<?
class MinhaClasse {
	function helloWorld ($nome) {
		return "Hello World ".$nome;
	}
	
}
?>

App Blank (Test_Cliente_Soap) para consumir o webservice evento onExecute:
Esse código funciona direitinho:

$options = array( 'location' => 'http://192.168.153.130/sc/8/app/webservice/Test_Servidor_Soap',
						   'uri' => 'http://192.168.153.130/sc/8/app/webservice/Test_Servidor_Soap' );
	
	
	$client = new SoapClient(null, $options);
	
	print_r(  $client->helloWorld("Maneco Programer Analist") );

Ms usando a macro não funciona:

$options = array( 'location' => 'http://192.168.153.130/sc/8/app/webservice/Test_Servidor_Soap',
						   'uri' => 'http://192.168.153.130/sc/8/app/webservice/Test_Servidor_Soap' );
	
	
	//$client = new SoapClient(null, $options);
	
	//print_r(  $client->helloWorld("Maneco Programer Analist") );

$arr_param = array(
					   'trace' => true,
					   'exceptions' => true,
					   'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
					   'connection_timeout' => 1000
					  );


	$obj_soap = sc_webservice("soap", 'http://192.168.153.130/sc/8/app/webservice/Test_Servidor_Soap', 80, "", "",$arr_param, 30);
      print_r(  $obj_soap ->helloWorld("Maneco Programer Analist") );

No exemplo não uso WSDL.

Bom dia, também participei do seminário e não achei que essa macro facilita a nossa vida.
Pelo que vi ela apenas muda a maneira de escrevermos o código PHP, não acho que facilitou muito.
Ainda prefiro usar a escrita padrão de curl e soap.

Sinceramente.
Outro dia tentei usar esta macro.
Não sei se é somente a falta de documentação com mais exemplos.
Mas me compliquei todo. Sempre dava erro na execução.
Queria pegar os valores da alíquota para o phpnfe no IBPT.

Como passar esta consulta ao IBPT para a macro sc_webservice?

// baesado no manual do php -> http://php.net/manual/pt_BR/book.curl.php

// teste para produto

// inicia a variável que guardara a url;
$url= “http://iws.ibpt.org.br/api/deolhonoimposto/produto?token=meutokenxxxx&cnpj=meucnpjxxxx&codigo=85234920&uf=PR&ex=0”;

//inicializa uma sessão curl e guarda numa variável
$curlhandle=curl_init();

// seta o meio de transferência
curl_setopt($curlhandle, CURLOPT_URL, “$url”);
curl_setopt($curlhandle, CURLOPT_HEADER, 0); // elimia o cabeçalho da resposta

//imprime o retorno no navegador
curl_exec($curlhandle);

// close cURL resource, and free up system resources
curl_close($curlhandle);

echo “
”;

// teste para serviço

// inicia a variável que guardara a url;
$url= “http://iws.ibpt.org.br/api/deolhonoimposto/servico?token=meutokenxxxx&cnpj=meucnpjxxxx&codigo=111032200&uf=PR&ex=0”;

//inicializa uma sessão curl e guarda numa variável
$curlhandle=curl_init();

// seta o meio de transferência
curl_setopt($curlhandle, CURLOPT_URL, “$url”);
curl_setopt($curlhandle, CURLOPT_HEADER, 0); // elimia o cabeçalho da resposta

//imprime o retorno no navegador
curl_exec($curlhandle);

// close cURL resource, and free up system resources
curl_close($curlhandle)

Como os colegas disseram é mais fácil usar a sintaxe do manual do php do que a macro em si.

Quando o windows 95 saiu eu tive que reinstalar ele 95 vezes para começar a ficar estável e eu poder usar.
Com a macro sc_webservice eu tive que usar o método tentativa e erro mais vezes que Thomas Edson ao inventar a lâmpada.
Tudo se define ao péssimo manual da macro:
onde se lê:

Retorno(opcional) Formato de retorno do web service. Quando informado como “true”, a resposta do web service é retornada em formato de array, caso contrário mantém-se o formato de retorno original do serviço. Default: true.

Deveria dizer true = xml transformado em array.

Como o retorno do webservice do IBPT retornava um json era somente este erro que aparecia:
"Atenção
simplexml_load_string(): Entity: line 1: parser error : Start tag expected, ‘<’ not found
Atenção
simplexml_load_string(): {“Codigo”:“85234920”,“UF”:“PR”,“EX”:0,“Descricao”:“Suportes gravados,p/leit.raio
Atenção
simplexml_load_string(): ^”

E então eu fiquei quebrando a cabeça para resolvê-lo e foram horas que se transformaram em alguns dias.
Ai lembrei de meu Pai que dizia que a cabeça é feita para muito mais que separar as duas orelhas.
E me concentrei na mensagem do erro e não na sua resolução.
Notei que ele transformava o xml em array. Horas! Isto nunca aconteceria com json se a resposta que o sc espera é um xml.

Logo, se o retorno é xml use como True o parâmetro “Retorno”, se for Json use como false.

Aqui vai a sintaxe que usei para o retorno do webservice (http://iws.ibpt.org.br/Help) numa app blank:

$url= “http://iws.ibpt.org.br/api/deolhonoimposto/produto”;
// sintaxe da macro sc_webservice(“Método”, “URL”, “Porta”, “Método de Envio”, “Array de Parâmetros”, “Array de Configuração”, “Timeout”, “Retorno”)
$configuracao=array(CURLOPT_RETURNTRANSFER => true);
$params[‘token’] = “meu token secreto, obtenha o seu no IBPT”;
$params[‘cnpj’] = “Meu cnpj”;
$params[‘codigo’] = “85234920”;
$params[‘uf’] = “PR”;
$params[‘ex’] = “0”;
$params=http_build_query($params);

$resposta=sc_webservice(“curl”,"$url",80,“GET”,$params,$configuracao,30,false);
echo $resposta;

imprimiu no navegador:

{“Codigo”:“85234920”,“UF”:“PR”,“EX”:0,“Descricao”:“Suportes gravados,p/leit.raio laser,de fenom. dif.som/imag”,“Nacional”:13.98,“Estadual”:7.00,“Importado”:26.32}

[size=14pt]Aqui vai minha sugestão para netmake: Por favor melhorem este manual![/size]

Eu utilizo a leitura direta do site IBPT.

$token = ‘cC1vCCyPDu2FI2QSXtPtJzCYPOjytRBhynhhyhrHv2X6YuUjhY5lNiyLcoeX4gzgpTktBKoZ’;
$cnpj = ‘12345678910’;

$result = file_get_contents("http://iws.ibpt.org.br/api/deolhonoimposto/produto?token=$token&cnpj=$cnpj&codigo=$ncm&uf=$uf&ex=$ex");

if($result === false)
{
$result = NULL;
}
else
{
$result = json_decode($result);
}
$result = get_object_vars($result);
return $result;

Obrigado por contribuir com mais esta forma de acesso.

Prezados,

Tentei seguir o exemplo do Haroldo e a aplicação NÃO funcionou. Alguém pode me dizer como faço uma aplicação web service Server, para rodar dentro do Sc 81.?

Obrigado.

kkkkkkkkkkkkkkkkkkkkkkkk

Oi Jailton,

Suas palavras de incentivo deram resultado. Mergulhamos no código proposto pelo Haroldo e descobrimos erros na nossa cópia. Corrigimos e tudo FUNCIONOU CORRETAMENTE. Obrigado.

Boa noite,

Eu na verdade estranho muito, a NetMake faz diversos macros e foruns e demonstrações…sobre como integrar com correio, paypal, google, etc quando na minha modestíssima opinião ela deveria fazer um esforço único, mesmo que mais longo, difícil, demorado de fazer com que a ferramenta “leia” o webservices/api, através de sua wsdl por exemplo, vou até citar um concorrente o WinDev, que incorporou e até aprimorou a funcionalidade que existe no .net, infelizmente, para nós pobres brasileiros a ferramente que é cara fica ainda mais com os tributos sobre a importação, que por algum motivo ainda envia DVD para que compra a ferramenta.
O Scriptcase é mais barato, nacional, é bom, mas em minha opinião falha em minha opinião nesta questão, pois fazer projetos que possuam integrações com os ERPs do mercado, tipo SAP, Protheus, DataSul e etc, rendem bom dinheiro, aliás, muito bom dinheiro pois as horas de desenvolvimento nesta área são muito bem pagas, como muitos aqui sabem. Se o Scriptcase tivesse uma ferramenta como esta, seria sensacional.