Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Exemplo completo webservice REST ADVPL
#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.
@fernandoadvpl

This comment has been minimized.

Copy link

@fernandoadvpl fernandoadvpl commented May 24, 2018

Show de bola !!

Obrigado por compartilhar.

@davidpulz

This comment has been minimized.

Copy link

@davidpulz davidpulz commented Jan 24, 2019

Poderia me ajudar com a url que devo passar no POST via Browser/PostMan?

@arcanj0

This comment has been minimized.

Copy link

@arcanj0 arcanj0 commented Mar 21, 2019

Poderia me ajudar com a url que devo passar no POST via Browser/PostMan?

Boa pergunta. Como seria a URL ?

@evtcorreia

This comment has been minimized.

Copy link

@evtcorreia evtcorreia commented Dec 17, 2019

Também estou com essa duvida, como seria a URL?

@vitorebatista

This comment has been minimized.

Copy link
Owner Author

@vitorebatista vitorebatista commented Dec 18, 2019

Neste caso seria o ip:porta definidos na configuração do REST do Protheus, concatenado com o nome do WS que neste exemplo é tstwsrest, assim como a rota GET, POSTou DELETE. Ficaria algo assim:

http://localhost:8080/rest/tstwsrest/users

Esta chamada GET retornaria a lista de usuários, que neste exemplo está em uma variável static .

Este link do TDN pode ajudar um pouco mais.

@dabraga

This comment has been minimized.

Copy link

@dabraga dabraga commented Jan 27, 2020

Vitor,

Estou passando assim no PostMan -> http://187.94.60.76:1476/rest/TSTWSREST/GET/users
Porém não está entrando nos when, sempre está caindo no SetRestFault(400,"Ops") . consegue ajudar. ?

@vitorebatista

This comment has been minimized.

Copy link
Owner Author

@vitorebatista vitorebatista commented Jan 27, 2020

@dabraga neste caso não precisa especificar na URL o /get/ chame apenas assim:

http://187.94.60.76:1476/rest/TSTWSREST/users

@dabraga

This comment has been minimized.

Copy link

@dabraga dabraga commented Jan 27, 2020

deu certo

@leandroudala

This comment has been minimized.

Copy link

@leandroudala leandroudala commented Feb 5, 2020

Código funcionou muito bem, obrigado por compartilhar!

Existe alguma função no Protheus que converta "param1=Valor1&param2=valor2" em Array ou JSON, ou será necessário sempre enviar dados para o servidor em formato JSON?

@Ricktreze

This comment has been minimized.

Copy link

@Ricktreze Ricktreze commented Apr 5, 2021

É 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment