<?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: Wladimir</title>
    <description>The latest articles on DEV Community by Wladimir (@wladimirsouza).</description>
    <link>https://dev.to/wladimirsouza</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%2F648395%2F86dab038-eda6-4137-b721-ab6072b9c134.png</url>
      <title>DEV Community: Wladimir</title>
      <link>https://dev.to/wladimirsouza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wladimirsouza"/>
    <language>en</language>
    <item>
      <title>WebAPI com .NET Consumindo ServiceLayer SAPB1</title>
      <dc:creator>Wladimir</dc:creator>
      <pubDate>Sat, 04 May 2024 14:08:32 +0000</pubDate>
      <link>https://dev.to/wladimirsouza/webapi-com-net-consumindo-servicelayer-sapb1-j1c</link>
      <guid>https://dev.to/wladimirsouza/webapi-com-net-consumindo-servicelayer-sapb1-j1c</guid>
      <description>&lt;p&gt;A ideia desse post é mostrar uma API desenvolvida em .NET Core consumindo a Service Layer do SAP. No cenário descrito, é utilizado o SAP B1.&lt;br&gt;
Service Layer é um serviço do SAP onde é possível consumir as funcionalidades do SAP, como visualizar/cadastrar usuários, pedidos de vendas/compras, itens, etc. Os endpoints disponíveis podem ser visualizados nesse link:&lt;br&gt;
&lt;a href="https://help.sap.com/doc/056f69366b5345a386bb8149f1700c19/10.0/en-US/Service%20Layer%20API%20Reference.html"&gt;https://help.sap.com/doc/056f69366b5345a386bb8149f1700c19/10.0/en-US/Service%20Layer%20API%20Reference.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É um serviço muito interessante mas ele tem algumas peculiaridades tais como a necessidade de realizar um login prévio para que os endpoints possam ser consumidos e também a resposta para requisições GET possuírem no máximo 20 registros. Segundo a documentação, esse é o valor padrão para não afetar a performance pois dependendo da empresa, alguns serviços podem ter vários registros.&lt;br&gt;
Mas isso pode ser um problema para certas ferramentas que não trabalham bem com requisições que necessitem de login e também para sistemas que precisam de todos os registros cadastrados. Por isso uma solução seria desenvolver uma API para consumir os serviços. Assim é possível manipular esse cenário.&lt;br&gt;
Para resolver essa situação, o cenário desenvolvido seria como mostrado na imagem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbuw8qj94fqlo3qgbnzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbuw8qj94fqlo3qgbnzd.png" alt="Image description" width="800" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O funcionamento do cenário então se dá no seguinte: a aplicação chama a API, que fica responsável pelo login, manipulação da quantidade de registros e envio do token que será utilizado nas requisições. A API terá a responsabilidade de consumir os endpoints do SAP. Este retorna o resultado para a API desenvolvida e esta retorna o resultado para a aplicação. Com a API desenvolvida é possível manipular a quantidade de registros já que é uma informação que é necessária ser enviada no header.&lt;/p&gt;

&lt;p&gt;Com a API rodando, ela está documentada com o Swagger conforme mostrado abaixo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7eyv849xfbjhkcdrf0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7eyv849xfbjhkcdrf0d.png" alt="Image description" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na API desenvolvida, foi utilizada apenas o cenário de busca de itens. Mas é possível adaptar para qualquer outro cenário utilizando um dos endpoints oferecidos pelo SAP conforme link acima. Basta apenas criar suas rotas específicas com suas respectivas classes. &lt;br&gt;
Abaixo segue a API rodando buscando todos os itens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7765ipzjyfvwvcyzunzq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7765ipzjyfvwvcyzunzq.png" alt="Image description" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O repositório da API pode ser consultado no link: &lt;a href="https://github.com/WraSouza/sap_api"&gt;https://github.com/WraSouza/sap_api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qualquer contribuição sempre será bem-vinda.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura.&lt;/p&gt;

</description>
      <category>sapb1</category>
      <category>dotnet</category>
      <category>developer</category>
    </item>
    <item>
      <title>Docker Volume</title>
      <dc:creator>Wladimir</dc:creator>
      <pubDate>Sun, 15 Oct 2023 13:55:30 +0000</pubDate>
      <link>https://dev.to/wladimirsouza/docker-volume-4813</link>
      <guid>https://dev.to/wladimirsouza/docker-volume-4813</guid>
      <description>&lt;p&gt;Hoje vamos falar sobre Docker Volume, uma funcionalidade que pode salvar sua vida. &lt;br&gt;
Ao utilizarmos o docker para criar nossos containers, em muitos cenários nós inserimos os arquivos dentro do container. Como o exemplo abaixo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EqP6B6sA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1oy1k6hy2ylvd6t86844.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EqP6B6sA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1oy1k6hy2ylvd6t86844.png" alt="Image description" width="342" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FROM nginx&lt;br&gt;
COPY arquivo.txt /usr/share/nginx/html/&lt;br&gt;
EXPOSE 80&lt;/p&gt;

&lt;p&gt;Nesse exemplo, pegamos o arquivo "arquivo.txt" e colocamos ele dentro do container criado. O usuário irá interagir com o arquivo, inserindo, modificando ou apagando informações. Mas como esse arquivo está localizado dentro do container, então temos um problema.Caso o container seja eliminado - independente do motivo - esse arquivo, assim como todas suas modificações também será perdido.Esse cenário inclui também uma base de dados.Pode ser que você tenha utilizado uma imagem de um MySQL, MariaDB, etc.E é nesse cenário que o docker volume surge para eliminar esse problema. Ao utilizar essa abordagem, o arquivo não é colocado dentro do container. Ao invés disso, é criado um mapeamento do container para o arquivo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--58Cl_kf6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sy16w0wbzkqgi9hbtddm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--58Cl_kf6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sy16w0wbzkqgi9hbtddm.png" alt="Image description" width="703" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como mostrado na imagem acima, o arquivo não estará dentro do container, mas apenas mapeado.Toda interação realizada no arquivo ou base de dados, será realizado no container mas salvo em um diretório da sua máquina.E mesmo que o container seja deletado, o arquivo, ou a base de dados não será perdido. Muito legal, não é!? Mas essa abordagem é perfeita!? Bom, nem tudo são flores. Como tudo fica salvo em um diretório da máquina, você terá que garantir que ninguém terá como apagar esse diretório, caso contrário você terá tudo perdido. Mas é uma abordagem bem interessante para garantir que os dados não sejam perdidos.&lt;/p&gt;

&lt;p&gt;Curtiu essa dica? Escreve aqui o que achou, dando sugestões, dicas, melhorias. &lt;/p&gt;

&lt;p&gt;Este está sendo minha postagem nesse blog e conto com vocês da comunidade para melhorias.&lt;/p&gt;

&lt;p&gt;Valeu.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
