-
-
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?
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, POSTou 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?
Show de bola !!
Obrigado por compartilhar.