No post anterior sobre REST aprendemos a configurar o appserver para responder como servidor REST, se ainda nao viu esse post clique aqui.
Nesse post vamos criar um WebService simples para retornar os dados dos clientes através de REST.
Trataremos neste código sobre paginação, filtros e retorno JSON.
O para acessar o nosso WS, vamos usar {endereço WS configurado}/path definido no WS.
Abaixo o código usando:
#include "TOTVS.CH" #Include "RWMAKE.CH" #Include "RESTFUL.CH" //Exemplo de WS para retorno do cliente //Para mais informações acesse: www.sempreju.com.br e/ou nosso GIT https://github.com/llrafaell/SemPreju-Exemplos WSRESTFUL SPCliente DESCRIPTION "Clientes API" FORMAT APPLICATION_JSON WSDATA page AS INTEGER OPTIONAL WSDATA pageSize AS INTEGER OPTIONAL WSDATA searchKey AS STRING OPTIONAL WSDATA branch AS STRING OPTIONAL WSDATA byId AS BOOLEAN OPTIONAL //Endereço para pegar os dados //http://localhost:8082/rest/api/v1/spcliente //WSMETHOD GET customers DESCRIPTION 'SP Lista de Clientes' WSSYNTAX '/api/v1/spcliente' PATH '/api/v1/spcliente' TTALK 'V1' PRODUCES APPLICATION_JSON //-- Retorna lista de clientes, com possibilidade de paginaçao e filtros. WSMETHOD GET customers DESCRIPTION 'SP Lista de Clientes' WSSYNTAX '/api/v1/spcliente' PATH '/api/v1/spcliente' PRODUCES APPLICATION_JSON //-- Retorna lista de clientes, com possibilidade de paginaçao e filtros. END WSRESTFUL //------------------------------------------------------------------- /*/{Protheus.doc} GET / cliente Retorna a lista de clientes disponíveis. @param SearchKey , caracter, chave de pesquisa utilizada em diversos campos Page , numerico, numero da pagina PageSize , numerico, quantidade de registros por pagina byId , logico, indica se deve filtrar apenas pelo codigo @return cResponse , caracter, JSON contendo a lista de clientes @author rafael.goncalves @since Mar|2020 @version 12.1.27 /*/ //------------------------------------------------------------------- WSMETHOD GET customers WSRECEIVE searchKey, page, pageSize, branch WSREST SPCliente Local lRet:= .T. lRet := Customers( self ) Return( lRet ) Static Function Customers( oSelf ) Local aListCli := {} Local cJsonCli := '' Local oJsonCli := JsonObject():New() Local cSearch := '' Local cWhere := "AND SA1.A1_FILIAL = '"+xFilial('SA1')+"'" Local nCount := 0 Local nStart := 1 Local nReg := 0 Local nAux := 0 Local cAliasSA1 := GetNextAlias() Default oself:searchKey := '' Default oself:branch := '' Default oself:page := 1 Default oself:pageSize := 20 Default oself:byId :=.F. // Tratativas para realizar os filtros If !Empty(oself:searchKey) //se tiver chave de busca no request cSearch := Upper( oself:SearchKey ) If oself:byId //se filtra somente por ID cWhere += " AND SA1.A1_COD = '" + cSearch + "'" Else//busca chave nos campos abaixo cWhere += " AND ( SA1.A1_COD LIKE '%" + cSearch + "%' OR " cWhere += " SA1.A1_LOJA LIKE '%" + cSearch + "%' OR " cWhere += " SA1.A1_NOME LIKE '%" + FwNoAccent( cSearch ) + "%' OR " cWhere += " SA1.A1_NREDUZ LIKE '%" + FwNoAccent( cSearch ) + "%' OR " cWhere += " SA1.A1_NREDUZ LIKE '%" + cSearch + "%' OR " cWhere += " SA1.A1_NOME LIKE '%" + cSearch + "%' ) " EndIf EndIf If !Empty(oself:branch) //se filtra a loja cWhere += " AND SA1.A1_LOJA = '"+oself:branch+"'" EndIf dbSelectArea('SA1') DbSetOrder(1) If SA1->( Columnpos('A1_MSBLQL') > 0 ) //verifica se o campo de controle de bloqueio existe, se sim filtra esse caso cWhere += " AND SA1.A1_MSBLQL <> '1'" EndIf cWhere := '%'+cWhere+'%' //monta a expressao where // Realiza a query para selecionar clientes BEGINSQL Alias cAliasSA1 SELECT SA1.A1_COD, SA1.A1_LOJA, SA1.A1_NOME, SA1.A1_END FROM %table:SA1% SA1 WHERE SA1.%NotDel% %exp:cWhere% ORDER BY A1_COD ENDSQL If ( cAliasSA1 )->( ! Eof() ) //------------------------------------------------------------------- // Identifica a quantidade de registro no alias temporário //------------------------------------------------------------------- COUNT TO nRecord //------------------------------------------------------------------- // nStart -> primeiro registro da pagina // nReg -> numero de registros do inicio da pagina ao fim do arquivo //------------------------------------------------------------------- If oself:page > 1 nStart := ( ( oself:page - 1 ) * oself:pageSize ) + 1 nReg := nRecord - nStart + 1 Else nReg := nRecord EndIf //------------------------------------------------------------------- // Posiciona no primeiro registro. //------------------------------------------------------------------- ( cAliasSA1 )->( DBGoTop() ) //------------------------------------------------------------------- // Valida a exitencia de mais paginas //------------------------------------------------------------------- If nReg > oself:pageSize oJsonCli['hasNext'] := .T. Else oJsonCli['hasNext'] := .F. EndIf Else //------------------------------------------------------------------- // Nao encontrou registros //------------------------------------------------------------------- oJsonCli['hasNext'] := .F. EndIf //------------------------------------------------------------------- // Alimenta array de clientes //------------------------------------------------------------------- While ( cAliasSA1 )->( ! Eof() ) nCount++ If nCount >= nStart nAux++ aAdd( aListCli , JsonObject():New() ) aListCli[nAux]['id'] := ( cAliasSA1 )->A1_COD aListCli[nAux]['name'] := Alltrim( EncodeUTF8( ( cAliasSA1 )->A1_NOME ) ) aListCli[nAux]['branch'] := ( cAliasSA1 )->A1_LOJA aListCli[nAux]['address'] := ( cAliasSA1 )->A1_END If Len(aListCli) >= oself:pageSize Exit EndIf EndIf ( cAliasSA1 )->( DBSkip() ) End ( cAliasSA1 )->( DBCloseArea() ) oJsonCli['clients'] := aListCli //------------------------------------------------------------------- // Serializa objeto Json //------------------------------------------------------------------- cJsonCli:= FwJsonSerialize( oJsonCli ) //------------------------------------------------------------------- // Elimina objeto da memoria //------------------------------------------------------------------- FreeObj(oJsonCli) oself:SetResponse( cJsonCli ) //-- Seta resposta Return .T.
O código fonte desse e outros exemplos podem ser encontrados em nosso git.
Para testar o nosso WS, vamos usar a ferramenta Postman.
1-Instale o postman através do link de download aqui.
2-Execute o postman e informe a URL como no print abaixo:
3-Ao clicar em “SEND”, se tudo ocorreu bem, devemos ver a nossa lista de clientes como retorno.
4-Para usarmos o filtro ou paginação, devemos adicionar as “tag”no Header de nossa requisição, para isso no postman, vamos clicar em Header e por exemplo adicionar um filtro, no nosso WS o filtro foi definido com a tag searchKey, a requisição e retorno deve ficar como o print abaixo.
Assim concluimos nosso primeiro WS.
Post relacionados:
Aprenda a instalar o Protheus aqui.
Aprenda a mudar o logo do sistema aqui.
Aprenda a diferença de path relativo e absoluto aqui.
Dúdivas e sugestões, entre em contato.
Obrigado e até a próxima!
0 comentário