-
-
Save vitorebatista/ce02d17cff99b39b67a852bf23d86bf9 to your computer and use it in GitHub Desktop.
#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. |
Poderia me ajudar com a url que devo passar no POST via Browser/PostMan?
Boa pergunta. Como seria a URL ?
Também estou com essa duvida, como seria a URL?
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
, POST
ou DELETE
. Ficaria algo assim:
Esta chamada GET retornaria a lista de usuários, que neste exemplo está em uma variável static
.
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. ?
@dabraga neste caso não precisa especificar na URL o /get/
chame apenas assim:
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?
Poderia me ajudar com a url que devo passar no POST via Browser/PostMan?