WordPress XML-RPC Com Delphi e Indy 10
O WordPress suporta comunicação remota, atravéz de XML-RPC, ontem ajudei um amigo a criar um aplicativo simples em Delphi, para postar e fazer upload de arquivos com Delphi e Indy 10.
A minha primeira tentativa foi utilizando o RemObjects, mas ele apresentou alguns bugs, eu corrigi os fontes do RemObjects e consegui fazer a chamada, mas analisando a necessidade, vi que poderia ser feito de forma mais simples, utilizando apenas o Indy e escrevendo alguns poucos métodos.
Já comecei a escrever um exemplo de como implementar usando o Jazz SDK, a nova versão que está no forno, será um exemplo que acompanhará os fontes, mas por enquanto vou escrever as dicas de como fazer o upload de arquivos, que servirá como base para todas as funções do WordPress descritas na página Codex XML-RPC wp.
Método remoto para enviar um arquivo: wp.uploadFile
Parâmetros:
- int blog_id
- string username
- string password
- struct data
- string name
- string type
- base64 bits
- bool overwrite
Resultado:
- struct
- string file
- string url
- string type
Onde:
Primeiro o tipo correspondente e segundo o nome do campo.
Struct se refere a estrutura de um Objeto em Delphi.
O primeiro passo é montar a requisição, a requisição pode ser montada utilizando TXMLDocument, ou outro gerador de XML Nodes. O formato do XML é o padrão definido para qualquer comunicação XML-RPC, este aqui é o modelo de um XML para a chamada de envio de um arquivo:
<methodCall>
<methodName>wp.uploadFile</methodName>
<params>
<param>
<value>
<int>[blog_id value]</int>
</value>
</param>
<param>
<value>
<string>[username value]</string>
</value>
</param>
<param>
<value>
<string>[password value]</string>
</value>
</param>
<struct>
<member>
<name>name</name>
<value><string>[name filename.ext value]</string></value>
</member>
<member>
<name>type</name>
<value><string>[type mime datatype]</string></value>
</member>
<member>
<name>bits</name>
<value><base64>[bits file content]</base64></value>
</member>
<member>
<name>override</name>
<value><bool>[override value]</bool></value>
</member>
</struct>
</params>
</methodCall>
As chaves “[" e "]” e a descrição entre elas, devem ser substituídos pelos valores dos conteúdos correspondentes, descritos em Parâmetros acima.
O blog_id, deve ser recuperado com a chamada remota do método “wp.getUsersBlogs“, a seguir login e senha do usuário, e o struct do arquivo a ser enviado.
Onde name é o nome do arquivo, com extensão, a extensão é importante pois o WordPress validará se o tipo do arquivo é aceito, pela extensão.
type é a descrição de tipo mime, de acordo com os tipos aceitos, descritos na página Using Attachments
bits é o conteúdo do arquivo, codificado no padrão “Encode 64″, e por fim o override, indica se um arquivo com o mesmo nome deve ou não ser sobrescrito.
O código em Delphi com Indy para enviar o arquivo fica assim:
procedure WPUploadFile(const FileName: string);
var
TargetURL: string;
DataFile, EncodedData, Request, Response: TMemoryStream;
begin
TargetURL:= 'http://www.url_do_blog.com.br/xmlrpc.php';
DataFile:= TMemoryStream.Create;
Request:= TMemoryStream.Create;
Response:= TMemoryStream.Create;
EncodedData:= TMemoryStream.Create;
DataFile.LoadFromFile(FileName);
DataFile.Position := 0;
try
EncodeStream(DataFile, EncodedData);
PrepareRequestXML(Request, EncodedData);
IdHTTTP1.IOHandler:= IdIOHandlerStack1;
IdHTTTP1.Post(TargetURL, Request, Response);
Response.Position:= 0;
MemoResponse.Lines.LoadFromStream(Response);
finally
Request.Free;
Response.Free;
DataFile.Free;
EncodedData.Free;
end;
end;
O método EncodeStream, está na unit EncdDecd.
O método PrepareRequestXML, é um método que escrevi para montar o XML Request, de acordo com o código XML acima.
Os componentes do Indy utilizados foram TIdHTTP e TIdIOHandlerStack, e todo o código da chamada é composto apenas de 2 linhas, o restante é apenas para chamar o código que monta o XML da requisição e receber o resultado, que será mostrado num memo chamado MemoResponse. O correto agora seria cria um objeto, com as propriedades retornadas, que são:
- file nome do arquivo salvo no servidor
- url url para acessar a imagem diretamente
- type tipo do arquivo
Em breve publicarei um exemplo de como criar postar no WordPress com Delphi, utilizando objetos feitos com o Jazz SDK.

3 Comments
Olá, qdo vai sair o exemplo de como postar no WordPress com Delphi ?
Obrigado
@Jose: Eu fiz isto e tenho em algum lugar, só não postei ainda.
Vou procurar e postar.
Olá, estou procurando por um exemplo de como postar no wordpress via Delphi e xmlrpc. Pode me ajudar por favor e postar um examplo de como fazer isso?
Obrigado!