Mostrando postagens com marcador XML. Mostrar todas as postagens
Mostrando postagens com marcador XML. Mostrar todas as postagens

segunda-feira, 8 de setembro de 2008

Webservice no BDS2006

Observamos que o assunto "WebService em Delphi" tem tido muita procura aqui no blog. Por isso, pretendo produzir mais material sobre este tema. Contudo, o assunto é abrange um escopo bastante vasto, principalmente no que tange as questões práticas do desenvolvimento de serviços baseados em XML/SOAP. Podemos citar para exemplificar alguns temas sobre “WebService e Delphi”: Testar as versões mais recentes (inclusive o Tiburon – Delphi 2009), verificar incompatibilidades (se existirem), ou diferenças. Uma coisa interessante seria a integração com outras tecnologias (Java, C# e PHP, por exemplo). Outro ponto importante: Acesso e disponibilização de dados (um CRUD, talvez, usando como camada intermediária um aplicação servidora WS). Em fim, há bastante terreno para ser trabalhado.
Neste sentido, podemos eventualmente atender alguma questão pontual demandada pelos leitores. Coloque em forma de comentários sua demanda que na medida do possível teremos prazer em atendê-la. Algumas pessoas já solicitam nosso suporte, informalmente, via e-mail. Porém, seria melhor que além do e-mail o comentário sobre a demanda fosse registrado. Pois, dessa forma aproveitamos a resolução do seu problema para conteúdo do blog. Assim, outros que por ventura vierem até nós com problemas semelhantes possam compartilhar da solução sem gerar retrabalho para nós. Conseqüentemente, imagino que nosso conteúdo será mais aderente. Isso é o que de fato nos importa.

Iniciando um novo projeto

No BDS2006 no menu File ►New ► Other ► Delphi Projects ►WebServices, selecione “SOAP Server Application”. Em seguida uma série de configurações prévias serão feitas mediante alguns diálogos.



No diálogo seguinte selecione ISAPI/NSAPI Dynamic Link Library, e click em “OK”.



Click “Yes” para criar a interface do serviço (WSDL). Veja imagem abaixo:



No próximo diálogo definiremos o nome do serviço que estamos criando: “ZnShowMeTheMoney”, conforme ilustrado abaixo.



Pronto, temos um novo projeto! Estamos desenvolvendo uma aplicação servidora. Um WebService, veja as units que foram cridas na inicialização do nosso projeto:



A lógica sobre declarações nas units, num projeto WebService: Existe uma unit para declarações de interface e uma unit para as implementarmos o que declararemos na unit interface (neste caso temos: “ZnShowMeTheMoneyIntf”, interface. “ZnShowMeTheMoneyImpl”, implementação).

Na interface declararemos uma função. Digite conforme ilustrado abaixo:


(* Declarando uma funcionalidade no serviço que estamos criando *)
function ZnShowMeTheMoney: WideString; stdcall;

A seguir, veja como ficou a unit “ZnShowMeTheMoneyIntf”.

{ Invokable interface IZnShowMeTheMoney }

unit ZnShowMeTheMoneyIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns;

type

{ Invokable interfaces must derive from IInvokable }
IZnShowMeTheMoney = interface(IInvokable)
['{F002F904-9FD7-401D-80E2-037DFFAA4590}']

{ Methods of Invokable interface must not use the default }
{ calling convention; stdcall is recommended }
(* Declarando uma funcionalidade no serviço que estamos criando *)
function ZnShowMeTheMoney: WideString; stdcall;
end;

implementation

initialization
{ Invokable interfaces must be registered }
InvRegistry.RegisterInterface(TypeInfo(IZnShowMeTheMoney));

end.


Agora para implementarmos iremos fazê-lo na unit “ZnShowMeTheMoneyImpl”. Digite conforme ilustrado no trecho de código asseguir:

type

{ TZnShowMeTheMoney }
TZnShowMeTheMoney = class(TInvokableClass, IZnShowMeTheMoney)
public
(* Na unit de implementação precisamos digitar novamente a assinatura do
método que declaramos na interface "ZnShowMeTheMoneyIntf" *)
function ZnShowMeTheMoney: WideString; stdcall;
end;

implementation


Declare uma seção “uses” após a palavra reservada “implementation” e declare as bibliotecas: Math e SysUtils.

OBS: No BDS temos code insight para declaração de bibliotecas!!!



Vamos implementar o método declarado na seção public de “TZnShowMeTheMoney”.

function TZnShowMeTheMoney.ZnShowMeTheMoney: WideString;
const
ZnMsgConst = 'Here is your Money, U$ %f! Do you can see him? look at the message ... ';
var
RandomValue: Double;
RandomDiv: Integer;
begin
RandomValue := RandomRange(1, 10000);
RandomDiv := RandomRange(1, 7);
RandomValue := (RandomValue / RandomDiv);

Result := Format(ZnMsgConst, [RandomValue]);
end


A função que acabamos de codificar, “ZnShowMeTheMoney”, é simplesmente um processamento dummy que retorna aleatoriamente dois valores, os quais são usados como operandos numa divisão cujo o resultado é formatado numa string e retornado na função.
Agora vamos salvar a aplicação, veja ilustração abaixo:




Para o nome do projeto vamos usar “PrjZNShowMoney.bdsproj”. A imagem seguinte mostra, o meu “Project Manager”, para que você possa compara a estrutura do seu projeto com o andamento do nosso exemplo.



Agora vamos publicar nosso serviço: Compile o projeto, em seguida faça o deploy da DLL, “PrjZNShowMoney.dll”, no IIS.

Criei um diretório virtual com alias de “WsShowMeTheMoneyZn”. Para testar, no browser digite: http://localhost/wsshowmethemoneyzn/

Click no link WSDL e você acessará a interface do serviço “IZnShowMeTheMoneyservice”, isso que você esta vendo é mais que uma página web comum.




Neste primeiro exemplo podemos concluir que o desenvolvimento em WS no BDS2006 é semelhante ao do Delphi 7.
É Muito rápido, intuitivo e amigável desenvolver serviços RPC baseados em SOAP/XML no DBS2006, desde que você conheça bem três conceitos:

1 - A estrutura de declarações no Delphi.

2 - Calling Conventions: Convenções de chamadas (traduziremos assim)- Quando declaramos procedimentos ou funções podemos definir, neste momento, a convenção de chamada através das diretivas: register, pascal, cdecl, stdcall, and safecall.
Por exemplo:

function ZNFuncao(const Xzn, Yzn: Double): Double; cdecl;

function ZNProcedimento(const Xzn, Yzn: Double; var AoutZn: Double); stdcall;

3- Sistemas distribuídos: Também chamado na literatura de objetos distribuídos.

Outros artigos sobre Webservice e Delphi

Artigo completo (View Full Post)

quinta-feira, 21 de fevereiro de 2008

Erro no processamento de XML: declaração xml não está

Erro no processamento de XML: declaração xml não está no início da entidade externa

Probleminha bizonho esse!
Essa mensagem de erro estava retornando ao acessar a URL do RSS de um site. Pra piorar, lá pelas tantas observei que o XML gerado, pelo script PHP, funcionava no IE, contudo, no Mozila, não. No inicio imaginei logo que pudesse ser incompatibilidade com o Mozila, tipo alguma tag que estava usando buggava o bagulho ... Mas, que nada ....


Para resolver o problema:

Veja o código fonte do XML que o seu script de servidor (seja JSP, PHP, ASP, ou mesmo Delphi) gerou (chame a URL http://SeuXMLouRSS ... o Browser vai exibir a mensagem de erro e veja o fonte) e verifique se há espaços em branco ou outras coisas esquisitas antes da declaração:
  
"<?xml version=....".


Caso verdadeiro, se houver, o Firefox não vai conseguir interpretar o XML. A mensagem de erro é bem clara:

Posição: [tal ...]
Número da linha 1, Coluna 2:

Portanto, verifique que vai haver linhas em branco no fonte. No meu caso, o fonte estava assim:


.
.
//Aqui tem espaço em braco
<?xml version="1.0" encoding="ISO-8859-1" ?>




<rss version="2.0">
<channel>
.
.


Depois de uma pesquisa rápida no Google, num Fórum um louco mencionou a questão das linhas em branco. Quando consegui fazer com que o script PHP fizesse isso:



<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0">
<channel>
<title>Blablablah- Notícias</title>
<link>http://www.bleng.com.br</link>
.
.


Sucesso!! O bagulho funfou!!!
Veja como ficou o script PHP .....


<?
header("Content-type: application/xml"); echo "<?xml version=\"1.0\"
encoding=\"ISO-8859-1\" ?>\n";
include("../../Conn/ZN_Conexao.php");
$sql = "SELECT
blah, Bleng, Landjah
FROM
Wandjah
WHERE
blah = '2'
ORDER by bleng DESC
LIMIT 5";
$query = mysql_query($sql);

?>
.
.
.

Artigo completo (View Full Post)

domingo, 10 de fevereiro de 2008

Apresentando dados em XML com XSL

Olá a todos novamente. Depois de um bom tempo fora as coisas se ajeitaram e o tempo acabou sobrando.

Comemoramos 1 ano do Estação ZN - Parabéns aos que postam e muitíssimo obrigado aos que dedicam um pedaço de seu tempo para ler.

O projeto começou com o intuito de ajudar a nós mesmos e também todos que compartilham das idéias, dúvidas e do material apresentado aqui.

Bem, agora vamos falar do assunto do post: Exibindo um documento XML formatado com folhas de estilo XSL

A maneira padrão de apresentar informações para o usuário na Web é o HTML. Esta linguagem começou orientada à formatação do texto a ser exibido para o usuário. Atualmente, com CSS o foco mudou um pouco: agora o objetivo é a informação, e usamos os estilos adequados à entidade que queremos exibir. Então, nas nossas páginas dinâmicas, nós produzimos HTML já formatado via código para exibir os dados.

Está se tornando cada vez mais comum o uso de WebServices (aplicações remotas invocadas através de HTTP e usando o padrão XML para troca de informações) para integrar aplicações na Web, além de outras tecnologias e paradigmas que usam o formato XML para compor resultados vindos do banco de dados. A questão é: como vamos exibir para o usuário as informações que ele quer/precisa ver de forma que ele entenda e que se "encaixe" no layout do site? Simples, vamos "destrinchar" o XML e a partir dele criar um documento HTML formatado, tudo via código. Brincadeira! Hehe...

É aqui que entra em cena as folhas de estilo para XML, as XSL ou XSLT (dois nomes, mesma coisa). Estas folhas de estilo diferem um pouco do CSS porque, enquanto o CSS criar regras de formatação para alguns elementos e classes para serem aplicadas, o XSL funciona como um "documento de apresentação", ou seja, um documento HTML onde indicamos onde cada elemento do documento XML vai aparecer. Como assim? Vamos ver na prática as duas implementações:

HTML:

folha de estilos: estilos.css


p {
font: normal 11px arial;
color: black;
}

.info-cliente {
font: bold arial 15px;
color: red;
}

#grid {
background: #eaeaea;
}


documento HTML: doc.html


<html>
<head>
<style type="text/css">
@import url(estilos.css);
</style>
</head>

<body>
<p>Parágrafo</p>

<div class="info-cliente">Formatação info-cliente</div>

<div id="grid">Grid</div>
</body>
</html>



Aqui o foco do documento é o layout e a informação é disposta junto com o ele.

Vamos ver agora um exemplo de XML com XSL:

folha de estilos: dados_cliente.xsl


<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='iso-8859-1' indent='yes'/>
<xsl:template match="/">
<html>
<h1>Dados do cliente</h1>

<b>Código:</b> <xsl:value-of select="cliente/codigo"/><br>
<b>Nome:</b> <xsl:value-of select="cliente/nome"/>
</html>
</xsl:template>
</xsl:stylesheet>


documento xml: dados_cliente.xml


<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="dados_cliente.xsl"?>
<cliente>
<codigo>1</codigo>
<nome>Felipe Guerço</nome>
</cliente>


Usando XML + XSL nosso documento de dados contém apenas a informação. Tudo relacionado à formatação entra na folha de estilos, que deixa de ser um arquivo só com definições de fontes, cores e outras formatações e passa a ser um documento completo de formatação dos dados.

Com XSL podemos fazer várias coisas legais. Ele nos oferece bastante recursos para exibir informações inclusive fazendo loop de vários "registros" dentro do XML.

Como o objetivo do post é dar uma visão geral sobre a tecnologia e mostrar suas vantagens, fico por aqui. Mas em breve trarei mais posts sobre recursos e aplicações práticas. Aquele abraço e até a próxima.

Artigo completo (View Full Post)

 
BlogBlogs.Com.Br