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

 
  1. jose disse:

    Olá, qdo vai sair o exemplo de como postar no WordPress com Delphi ?

    Obrigado

  2. Cesar disse:

    @Jose: Eu fiz isto e tenho em algum lugar, só não postei ainda.

    Vou procurar e postar.

  3. José disse:

    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!

 

Leave a Comment

 




XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>