Last active
January 2, 2025 14:59
-
-
Save vitorebatista/ce02d17cff99b39b67a852bf23d86bf9 to your computer and use it in GitHub Desktop.
Exemplo completo webservice REST ADVPL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "PROTHEUS.ch" | |
#include "RESTFUL.ch" | |
#xtranslate @{Header <(cName)>} => ::GetHeader( <(cName)> ) | |
#xtranslate @{Param <n>} => ::aURLParms\[ <n> \] | |
#xtranslate @{EndRoute} => EndCase | |
#xtranslate @{Route} => Do Case | |
#xtranslate @{When <path>} => Case NGIsRoute( ::aURLParms, <path> ) | |
#xtranslate @{Default} => Otherwise | |
Static aUsers := {{'1','Vitor','27'},{'2','Joao','40'},{'3','Jackson','25'}} | |
WsRestful tstwsrest Description "WebService REST para testes" | |
WsMethod GET Description "Sincronização de dados via GET" WsSyntax "/GET/{method}" | |
WsMethod POST Description "Sincronização de dados via POST" WsSyntax "/POST/{method}" | |
WsMethod DELETE Description "Sincronização de dados via DELETE" WsSyntax "/DELETE/{method}" | |
End WsRestful | |
WsMethod GET WsService tstwsrest | |
Local cUser := '' | |
Local nUser | |
::SetContentType( 'application/json' ) | |
@{Route} | |
@{When '/users'} | |
cUser := '[' | |
For nUser := 1 to Len(aUsers) | |
cUser += '{"id":'+ aUsers[nUser][1]+; | |
',"name":"'+aUsers[nUser][2]+; | |
'","age":'+aUsers[nUser][3]+'}' | |
cUser += if(nUser < Len(aUsers),',','') | |
Next nUser | |
cUser += ']' | |
::SetResponse(cUser) | |
@{When '/users/{id}'} | |
nUser := aScan(aUsers,{|x| x[1] == @{Param 2} }) | |
If nUser > 0 | |
cUser := '{"id":'+ aUsers[nUser][1]+; | |
',"name":"'+aUsers[nUser][2]+; | |
'","age":'+aUsers[nUser][3]+'}' | |
::SetResponse(cUser) | |
Else | |
SetRestFault(400,'Ops') | |
Return .F. | |
EndIf | |
@{Default} | |
SetRestFault(400,"Ops") | |
Return .F. | |
@{EndRoute} | |
Return .T. | |
WsMethod POST WsService tstwsrest | |
Local cJson := ::GetContent() | |
Local oParser | |
Local cUser, nUser | |
::SetContentType( 'application/json' ) | |
@{Route} | |
@{When '/user'} | |
If FwJsonDeserialize(cJson,@oParser) | |
aAdd(aUsers,{cValToChar(oParser:id),oParser:name,cValToChar(oParser:age)}) | |
nUser := Len(aUsers) | |
cUser := '{"id":'+ aTail(aUsers)[1]+; | |
',"name":"'+aUsers[nUser][2]+; | |
'","age":'+aUsers[nUser][3]+'}' | |
::SetResponse(cUser) | |
Else | |
SetRestFault(400,'Ops') | |
Return .F. | |
EndIf | |
@{Default} | |
SetRestFault(400,"Ops") | |
Return .F. | |
@{EndRoute} | |
Return .T. | |
WsMethod DELETE WsService tstwsrest | |
Local nUser | |
::SetContentType( 'application/json' ) | |
@{Route} | |
@{When '/user/{id}'} | |
nUser := aScan(aUsers,{|x| x[1] == @{Param 2} }) | |
If nUser > 0 | |
aDel(aUsers, nUser) | |
aSize(aUsers, Len(aUsers) - 1) | |
Else | |
SetRestFault(400,"Ops") | |
Return .F. | |
EndIf | |
@{Default} | |
SetRestFault(400,"Ops") | |
Return .F. | |
@{EndRoute} | |
Return .T. |
deu certo
Código funcionou muito bem, obrigado por compartilhar!
Existe alguma função no Protheus que converta "param1=Valor1¶m2=valor2" em Array ou JSON, ou será necessário sempre enviar dados para o servidor em formato JSON?
É possível manipular o código de retorno de sucesso?
Ex: Em uma requisição POST, ao invés de retornar 201, seria manipulado para o retorno 202 - Em Processamento.
Seria possível adicionar validação nas requisições, por exemplo, verificar se um token JWT enviado é valido?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@dabraga neste caso não precisa especificar na URL o
/get/
chame apenas assim: