<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manoel Angeiras</title>
    <description>The latest articles on DEV Community by Manoel Angeiras (@neoangeiras).</description>
    <link>https://dev.to/neoangeiras</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F845190%2F6c54a326-83bd-46c4-8671-29d07895b814.png</url>
      <title>DEV Community: Manoel Angeiras</title>
      <link>https://dev.to/neoangeiras</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neoangeiras"/>
    <language>en</language>
    <item>
      <title>Criando uma API REST no mod_harbour</title>
      <dc:creator>Manoel Angeiras</dc:creator>
      <pubDate>Tue, 12 Apr 2022 14:26:40 +0000</pubDate>
      <link>https://dev.to/neoangeiras/criando-uma-api-rest-no-modharbour-40lf</link>
      <guid>https://dev.to/neoangeiras/criando-uma-api-rest-no-modharbour-40lf</guid>
      <description>&lt;p&gt;Nesse tutorial, vamos criar e consumir uma API REST utilizando o mod_harbour. REST permite que voce acesse e trabalhe com serviços baseados na web. Mas antes de continuar esse tutorial, vamos ver de forma resumida o que é o REST e como funciona.&lt;/p&gt;

&lt;h4&gt;
  
  
  O que REST ?
&lt;/h4&gt;

&lt;p&gt;REST é um acrônimo que significa &lt;strong&gt;Re&lt;/strong&gt;presentacional &lt;strong&gt;S&lt;/strong&gt;tate &lt;strong&gt;T&lt;/strong&gt;ransfer. É um estilo de aquitetura que define um conjunto de restrições para desenvolvimento e consumo de serviços na web através do protocolo padrão HTTP. API REST é uma arquitetura de web service simples, fácil de implementar e stateless.&lt;/p&gt;

&lt;p&gt;API REST é amplamente usado em aplicações web e mobile. E pode prover output de dados em diversos formatos como: JSON, XML e CSV.&lt;/p&gt;

&lt;h4&gt;
  
  
  Como uma API REST funciona
&lt;/h4&gt;

&lt;p&gt;Requisições REST são relacionadas com operações CRUD (Create, Read, Update e Delete) no banco de dados. REST usa requisições GET, POST, PUT e DELETE. Vamos fazer uma rápida comparação dessas requisições com as operações CRUD:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET é usado para recuperar informações, o que é similar ao Read&lt;/li&gt;
&lt;li&gt;POST é usado para cruar novos registros, o que é similar ao Create&lt;/li&gt;
&lt;li&gt;PUT é usado para atualizar registros, o que é similar ao Update&lt;/li&gt;
&lt;li&gt;DELETE é usado para apagar registros, o que é similar ao Delete&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Como criar e consumir uma API REST em mod_harbour
&lt;/h4&gt;

&lt;p&gt;Vamos usar o formato JSON para consumir nossa API REST. É o formato mais simples e acho que também é o mais usado nos dias de hoje. Vamos desenvolver uma pesquisa através do código EAN de um produto para nosso exemplo. Vamos tentar manter o mais simples possível, então vamos usar a requisição GET para recuperar a informação.&lt;/p&gt;

&lt;h4&gt;
  
  
  Banco de dados utilizado
&lt;/h4&gt;

&lt;p&gt;Para o nosso exemplo, vamos utilizar um banco de padrão DBF, aproveitando que o Harbour manipula esse tipo de arquivo nativamente. Nosso banco de dados já está criado como "produtos.dbf" e o índice correspondente "produtos.cdx". É um arquivo com apenas alguns registros, que serve tranquilamente para nossos testes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Criando o arquivo API REST
&lt;/h4&gt;

&lt;p&gt;Vamos criar um arquivo chamado API.PRG&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function main()
   local hGet   := {=&amp;gt;} ,;
         hRet   := {=&amp;gt;} ,;
         cPath  := AP_GetEnv("DOCUMENT_ROOT")+"/api1/" ,;
         cAlias := ""
   //
   // Setar o content-type para o tipo correto 
   //
   AP_SetContentType( "application/json" )

   //
   // Testar se o método usado foi o GET
   //
   if AP_Method() == "GET"
      //
      // O retorno de AP_GetPairs() é um hash contendo todas as variáveis
      //
      hGet := AP_GetPairs()

      if HHasKey( hGet, "codbarra" ) .and. !empty(hGet["codbarra"])
         use (cPath + "produtos") shared new via "DBFCDX"
         set index to (cPath + "produtos.cdx")
         cAlias := alias()

         (cAlias)-&amp;gt;(dbSetOrder( 1 ))
         if (cAlias)-&amp;gt;(dbSeek( hGet["codbarra"] ))
            hRet['sucesso'] := .T.
            hRet['erro']    := ""
            hRet['descpro'] := alltrim((cAlias)-&amp;gt;descricao)
         else
            hRet['sucesso'] := .F.
            hRet['erro']    := "Codigo de barra nao encontrado"
         endif
      else
         hRet['sucesso'] := .F.
         hRet['erro']    := "Falta informar o código de barras ou nome da variavel esta errado (deve ser 'codbarra')"
      endif

      ?? hb_jsonencode( hRet )
   else
      ?? "Requisição para esse exemplo dever ser GET"
   endif
RETURN NIL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para testar o exemplo acima, podemos executar pelo browser da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;localhost/api1/api.prg?codbarra=7896185932013&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e o resultado será um JSON, contendo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "sucesso": true,
  "erro": "",
  "descpro": "DACTIL OB C/30 DRG ............. .."
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Poderíamos também alterar a forma como será construída a URL. Da forma que está não é "user-friendly". Teríamos que fazer alteração no arquivo .htaccess para que possa "entender" uma nova regra e permitir a digitação na forma:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;localhost/api1/api.prg/7896185932013&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Mas vamos deixar para um novo post. Acho que tem coisa mais importante: como autenticar usuario/senha gerando token JWT, como tratar desigualdades nas requisições GET (implementar LHS Brackets ou não vale a pena?), como "sanitizar" (olá PHP) de forma apropriada as requisições e mais.&lt;/p&gt;

&lt;p&gt;Até o próximo post.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Harbour para web</title>
      <dc:creator>Manoel Angeiras</dc:creator>
      <pubDate>Mon, 11 Apr 2022 13:22:09 +0000</pubDate>
      <link>https://dev.to/neoangeiras/harbour-para-web-kh</link>
      <guid>https://dev.to/neoangeiras/harbour-para-web-kh</guid>
      <description>&lt;p&gt;mod_harbour é um módulo para o Apache que permite que você execute os PRGs diretamente na web, sem precisar criar EXE, CGI, etc.&lt;/p&gt;

&lt;p&gt;É open source. Pode ser baixado na página do projeto no github em &lt;a href="https://github.com/mod-harbour/mod_harbour.v2"&gt;https://github.com/mod-harbour/mod_harbour.v2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O que precisa instalar/modificar?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servidor Apache rodando localmente ou remoto, que permita alteração no apache2.conf ou httpd.conf&lt;/li&gt;
&lt;li&gt;Módulo mod_harbour.v2.so ou mod_harbour.dll &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No github do projeto, você vai encontrar quais as linhas precisam ser alteradas no Apache e como instalar o mod_harbour.&lt;/p&gt;

&lt;p&gt;E pronto. Pra testar podemos criar um ola.prg simples, como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function main()
   ? "Ola, mundo"
return NIL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E chamar através do browser:&lt;br&gt;
&lt;code&gt;localhost/ola.prg&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;As possibilidades são imensas. Mas o que tenho dedicado mais tempo é estudar a criação de APIs RESTful. E o mod_harbour já tem tudo pronto. É até mais fácil do que no PHP, por exemplo.&lt;/p&gt;

&lt;p&gt;É isso que pretendo explorar nos posts seguintes.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
