Requisições no backend do Salesforce Commerce Cloud (SFCC) de forma fácil
Uma maneira fácil de fazer requisições.
Olá pessoal, hoje vou apresentar uma biblioteca que desenvolvi, mas antes preciso explicar um pouco sobre o ambiente ao qual ela surgiu.
Introdução
Vocês já ouviram falar de Salesforce Commerce Cloud (SFCC) ? Esta é uma das nuvens da Salesforce, ela é muito voltada para o desenvolvimento de lojas B2C.
Diferente de outras tecnologias, o desenvolvimento no SFCC é bem complicadinho... alguns pontos a se imaginar:
Todo projeto utiliza o Javascript (um ponto importante é que temos um JS do client e um JS do server)
As duas partes são bem limitadas, principalmente a parte do backend que utiliza o Mozilla Rhino
Basicamente, não podemos usar nada além dos imports do próprio sistema, o pacote (dw), esse é um pacote que só existe no universo SFCC, ele compõe um extenso conjunto de métodos e classes para manipular a loja.
Pelo que entendi, os métodos do pacote dw são métodos Java que podem ser executados, graças a intermediação do Rhino.
A versão que o Rhino trabalha parece muito com a do JS ES5
A organização e arquitetura de uma loja, quando estamos usando SFCC lembra muito o MVC.
O backend é muito similar ao express, no geral o trabalho com SFCC é bem tranquilo.
O problema é que o pacote dw é muito complicado, algumas coisas que poderiam ser simples são trabalhosas quando temos que fazer utilizando o dw, por exemplo, requisições a outras APIs.
Exemplos de Requests
Bem, se aprofundando no problema, vejo que muitos desenvolvedores se confundem sobre como fazer uma requisição usando o pacote dw.
Quando trabalhamos com requisições, começamos por um Service, isso é um objeto que podemos manipular via interface gráfica, ele é composto por um ID e uma URL basicamente.
Normalmente lemos o service no backend e realizamos a chamada para a API usando o pacote HTTPClient.
Exemplo de chamada com HTTPClient
const HTTPClient = require('dw/net/HTTPClient');
var httpClient = new HTTPClient();
httpClient.open('GET', 'url-do-service');
httpClient.setTimeout(3000);
httpClient.send();
if (httpClient.statusCode == 200) {
var message = httpClient.text; // Response
}
Como podemos observar, esse fragmento de código é simples, porém ele ignora a parte de leitura do service, o que daria mais um cadinho de linhas.
Ao longo de muitos projetos SFCC, me deparei com os mais diversos helpers para a execução de requisições, todos funcionam bem, mas algumas funcionalidades são inexistentes.
Exemplo de um helper
var ServiceHelper = require('*/cartridge/scripts/helpers/servicesHelper');
var RequestData = require('*/cartridge/scripts/builders/RequestData');
var requestData = new RequestData('id-do-service', 'enpoint');
requestData.setRequestMethod('GET');
var result = ServiceHelper.call(requestData);
if (result.ok) {
var message = result.text // response
}
O real problema é que para fazer nativamente é muito verboso, já no helper é mais fácil, porém algumas coisas não existem (por exemplo, ler ou setar headers)
SFCC Requests
Pensando nisso, decidi criar uma versão que pudesse ser completa nesse sentido, isso é basicamente uma versão do 'axios' ou do python 'requests'
Basicamente o pulo do gato é ter uma extensa gama de métodos para manipular a requisição antes e depois dela ser executada.
Exemplo de GET
const RequestService = require('*/cartridge/scripts/requests/RequestService.js')
const service = new RequestService("id-do-service");
if (!service.hasError) { // Pode acontecer do service não estar criado, então verificamos isso
var request = service.GET("endpoint") // se fosse POST seria service.POST ou qualquer outro metodo HTTP
var response = request.call() // aqui temos o status code, body e headers do response
}
Não vou descrever todos os métodos da biblioteca, mas você pode conferir eles aqui no github.
https://github.com/Lucas-Palomo/sfcc-requests
É um pouco estranho falar de SFCC para outros devs, já que é um universo muito desconhecido e diferente de outras tecnologias. Eu posso fazer um post explicando mais sobre o pacote dw e o Rhino
Essa não é a doc oficial, mas dá para ter uma noção de quanto o pacote dw é complexo
Escrevi esse mesmo artigo no linkedin