Olá pessoal,

Imagine que você precise criar um portal WEB em PHP, Java, ou qualquer outra linguagem de sua preferência, para fornecer informações para seus parceiros de negócio, sem que eles precisem acessar seu ERP.

Tal portal fornecerá informações para representantes, clientes, ou quem quer que seja. E essas informações precisam estar seguras. Com o REST, você consulta como um webservice somente os dados que estão disponíveis, no Servidor REST feito em Protheus.

Neste exemplo eu utilizei o PHP, que é uma linguagem para Web muito difundida no mercado.

Veja também:

Como configurar um servidor REST no Protheus

 

Então, como fazer um login com REST no Protheus? Eis o exemplo:

  1. Neste primeiro trecho, pode criar o arquivo com o nome de FBREST01.PRW, o qual conterá os métodos que serão acessados e disponibilizarão o resultado em JSON.
#Include 'protheus.ch'
#Include 'parmtype.ch'
#Include "RestFul.CH"
#Include "TopConn.ch"

//Constantes
#Define STR_PULA		Chr(13)+Chr(10)

/*/{Protheus.doc} FBREST01
Ensinando Rest em ADVPL
@author Fernando Bueno
@since 13/04/2017
@version undefined
@type function
/*/
User Function FBREST01()	
Return

/*/{Protheus.doc} AUTHUSER
Definição da estrutura do webservice
@author Fernando Bueno
@since 13/04/2017
@type class
/*/
WSRESTFUL AUTHUSER DESCRIPTION "Serviço REST para manipulação de usuarios/vendedores"
WSDATA USR As String //String que vamos receber via URL
WSDATA PWD As String //String que vamos receber via URL
 
WSMETHOD GET DESCRIPTION "Retorna o usuário autenticado na URL" WSSYNTAX "/AUTHUSER || /AUTHUSER/{USR}{PWD}" //Disponibilizamos um método do tipo GET
 
END WSRESTFUL


/*/{Protheus.doc} GET
Processa as informações e retorna o json
@author Fernando Bueno
@since 13/04/2017
@version undefined
@param oSelf, object, Objeto contendo dados da requisição efetuada pelo cliente, tais como:
   - Parâmetros querystring (parâmetros informado via URL)
   - Objeto JSON caso o requisição seja efetuada via Request Post
   - Header da requisição
   - entre outras ...
@type Method
/*/
WSMETHOD GET WSRECEIVE USR,PWD WSSERVICE AUTHUSER
//--> Recuperamos o usuário informado via URL 
//--> Podemos fazer dessa forma ou utilizando o atributo ::aUrlParms, que é um array com os parâmetros recebidos via URL (QueryString)
Local cUsr 		:= Self:USR
Local cPwd 		:= Self:PWD
Local aArea			:= GetArea()
Local oObjCom		:= Nil
Local aDados := {}
Local cJson			:= ""
Local aArray := {}

// define o tipo de retorno do método
::SetContentType("application/json")
PswOrder(2)
If PswSeek( cUsr, .T. )
	aArray := PSWRET()[1] // Retorna vetor com informações do usuário
	//cPwd := Decode64(cPwd)
	cCodVen := bscCodVen(PSWRET()[1][1])
	If PSWNAME(cPwd) .AND. !Empty(cCodVen)
	 	aAdd(aArray, cCodVen)
		oObjCom := UsrVend():New(aArray)
    EndIF	
EndIf


// --> Transforma o objeto de produtos em uma string json
cJson := FWJsonSerialize(oObjCom)
// --> Envia o JSON Gerado para a aplicação Client
::SetResponse(cJson)
RestArea(aArea)
Return(.T.)

/****************************************************************
Aqui você pode fazer a consistência com o cadastro de vendedores
No caso utilizei o campo padrão A3_USUCORP para colocar o código 
de usuário
*****************************************************************/
Static Function bscCodVen(cCodUsr)
Local cQryAux := ""
Local cRet := ""

//Montando consulta de dados
cQryAux := ""
cQryAux += " SELECT A3_COD FROM SA3010 WHERE D_E_L_E_T_ = ' ' AND A3_MSBLQL <> '1' AND A3_USUCORP LIKE '%" + AllTrim(cCodUsr) + "%' "
conout(cQryAux)
cQryAux := ChangeQuery(cQryAux)

//Executando consulta e setando o total da régua
TCQuery cQryAux New Alias "QRY_AUX"
Count to nTotal

//Enquanto houver dados
QRY_AUX->(DbGoTop())
While ! QRY_AUX->(Eof())
	cRet := QRY_AUX->(A3_COD)
	QRY_AUX->(dbSkip())
EndDo
QRY_AUX->(dbCloseArea())


Return cRet

2. Abaixo, outro código fonte que será utilizado para instanciar o objeto que será retornado no JSON, fazendo as devidas conversões. Está de forma simplificada, com atributo em array.

#include 'protheus.ch'
#include 'totvs.ch'

User Function LARESTA2()
Return

/*/{Protheus.doc} LARESTA2
Classe de comissões para realizar a serialização do objeto de comissões
@author Fernando Bueno
@since 14/04/2017
@version 1.0
@example
(examples)
@see (links_or_references)
/*/
Class UsrVend
	
	Data aDados	As Array
	
	Method New(aDados) Constructor
	 
EndClass

/*/{Protheus.doc} new
Metodo construtor
@author Fernando Bueno
@since 14/04/2017 
@version 1.0
@example
(examples)
@see (links_or_references)
/*/
Method New(aDad) Class UsrVend
::aDados := aDad
Return(Self)

3. Agora vai a parte WEB, em PHP. Crie uma página simples de login.

Faça download do código PHP aqui

Ao utilizar os fontes em anexo, atente-se para as seguintes mudanças:

No arquivo config/app.php, troque /suapasta para a sua respectiva pasta do seu Apache Server

<?php

define('SUBFOLDER', '/suapasta');
define('WS_URL', '');

?>

E na chamada do login, troque SEUIP para o seu servidor Protheus, onde está rodando o seu servidor REST. (Arquivo valida_login.php)

<?php include('config/app.php'); ?>

<?php

session_start();

if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST) > 0) {

	$url  = 'http://SEUIP/rest/AUTHVEND?USR=' . $_POST['usuario'] . '&PWD=' . $_POST['senha'];

	$result = file_get_contents($url);
	$json = json_decode($result, true);

	$_SESSION['nome'] = $json['ADADOS'][3];
	$_SESSION['codigo'] = $json['ADADOS'][0];
	$_SESSION['codvend'] = $json['ADADOS'][26];

	header('Location: ' . SUBFOLDER . '/');
	exit;

}

?>

Algumas observações pessoal: Não exemplifiquei aqui diretivas de segurança. Então, na sua configuração REST, verifique corretamente que tudo está seguro, antes de disponibilizar dados da sua empresa externamente a ela.

Este foi só um exemplo de login. Mas você pode gerar relatórios, gravar dados no Protheus e assim por diante. Também é o princípio básico pra você que quer criar um aplicativo Android como este que desenvolvemos, IOS etc. Crie o aplicativo e consuma os Web Services disponíveis.

Caso queira de aprofundar em web services pergunte-me como aqui no nosso formulário de contato

Links:

Como configurar REST no Protheus

Espero que seja útil e se tiver qualquer dúvida entre em contato