Consumindo uma API com Rest

Para consumir uma API, é necessário estudar o tipo de autenticação que a envolve e seus Métodos de Acesso / Atributos.

Segue abaixo um modelo.

#INCLUDE    'TOTVS.CH'
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'PARMTYPE.CH'
#INCLUDE  'RESTFUL.CH'

*****************************************************************************
*+-------------------------------------------------------------------------+*
*|Funcao      | REXPENSE  | Autor | Jader Berto                             |*
*+------------+------------------------------------------------------------+*
*|Data        | 15.04.2018                                                 |*
*+------------+------------------------------------------------------------+*
*|Descricao   | Importação para Tabelas do Protheus                              |*
*+------------+------------------------------------------------------------+*
*|Solicitante |                                                            |*
*+------------+------------------------------------------------------------+*
*|Partida     | WebService                                                   |*
*+------------+------------------------------------------------------------+*
*|Arquivos    |                                                            |*
*+------------+------------------------------------------------------------+*
*|             ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO INICIAL            |*
*+-------------------------------------------------------------------------+*
*| Programador       |   Data   | Motivo da alteracao                      |*
*+-------------------+----------+------------------------------------------+*
*|                   |          |                                          |*
*+-------------------+----------+------------------------------------------+*
*****************************************************************************

User function REXPENSE()

  Local   cUrl        := 'https://app.rexpense.com/api/v1/expenses'
  Local   oRestClient := FWRest():New(cUrl)
  Local   cJson       := ""
  Local   aHeader       := {}
  Local   cForn          := ""
  Private aArray       := {}
  Private oJson
  Private nDesp          := 0
  Private nPag          := 0
  Private lMsErroAuto := .F.
  Private oProcess  := NIL

  Aadd(aHeader,        "Authorization: Basic " + Encode64("718d582df5722aabacde30e146c8bae94886523d55b1e4f6:"))
  aAdd(aHeader,        "Content-Type: application/json; charset=UTF-8" )
  aAdd(aHeader,        "Accept: application/json" )
  aAdd(aHeader,        "User-Agent: Chrome/65.0 (compatible; Protheus " + GetBuild() + ")")

  DbSelectArea("SA2")
  SA2->(DbSetOrder(1))

  DbSelectArea("SE2")
  SE2->(DbSetOrder(1))


  oRestClient:setPath("")
  If oRestClient:Get(aHeader)

        cJson := oRestClient:GetResult()

        If FWJsonDeserialize(cJson,@oJson)


            oProcess := MsNewProcess():New( { | lEnd | lOk := BscDesp() }, "Processando", "Aguarde, consultando despesas no Rexpense...", .F. )
        oProcess:Activate()




        Else
            Help(NIL, NIL, "Falha na Comunicação", NIL, "Não possível realizar a leitura das informações do Rexpense.", 1, 0, NIL, NIL, NIL, NIL, NIL, {"Reportar o problema ao administrador do sistema."})
        EndIf

  Else
        Help(NIL, NIL, "Falha na Autenticação", NIL, "Não foi possível estabelecer a comunicação entre o Protheus e o Rexpense.", 1, 0, NIL, NIL, NIL, NIL, NIL, {"Solicitar ao administrador do sistema a atualização do Token."})
  EndIf

Return


/*--------------------------------------------------------
 [ CADASTRO DE FORNECEDORES ]
----------------------------------------------------------*/

Static function CadForn(cForn)
Local lRet   := .F.
Local aDados := {}

        aadd( aDados , { 'A2_COD'     , cForn                                    , Nil })
        aadd( aDados , { 'A2_LOJA'    , '01'                               , Nil })
        aadd( aDados , { 'A2_TIPO'    , 'F'                                , Nil })
        aadd( aDados , { 'A2_NOME'    , UPPER(oJson:expenses[nDesp]:receiver:name)  , Nil })
        aadd( aDados , { 'A2_NREDUZ'  , UPPER(oJson:expenses[nDesp]:receiver:name)  , Nil })
        aadd( aDados , { 'A2_END'     , SM0->M0_ENDCOB                     , Nil })
        aadd( aDados , { 'A2_BAIRRO'  , SM0->M0_BAIRCOB                    , Nil })
        aadd( aDados , { 'A2_EST'     , SM0->M0_ESTCOB                        , Nil })
        aadd( aDados , { 'A2_MUN'     , SM0->M0_CIDCOB                        , Nil })

        lMsErroAuto := .F.

        msexecauto( { | x , y | MATA020( x , y ) } , aDados , 3 )

        if lMsErroAuto
            RollbackSX8()
            mostraerro()
        else
            lRet := .T.
            confirmSX8()
        endif

return lRet




Static Function BscDesp()

    oProcess:IncRegua1( "Importando Despesas..." )

    For nDesp := 1 to Len(oJson:expenses)

            oProcess:IncRegua2("R$ "+TRANSFORM(oJson:expenses[nDesp]:approved_amount, "999,999,999.99")+ oJson:expenses[nDesp]:description )

                If TYPE("oJson:expenses[nDesp]:approved_amount") # "U"

                    cForn := "ID"+cValToChar(oJson:expenses[nDesp]:receiver:id)
                    If !SA2->(DbSeek(xFilial("SA2")+cForn))
                        If !CadForn(cForn)
                            Return
                        EndIf
                    EndIf

                    If !SE2->(DbSeek(xFilial("SE2")+;
                                     "RXP"+;
                                     PADR(cValToChar(oJson:expenses[nDesp]:id),TAMSX3("E2_NUM")[1])))

                    aArray := { { "E2_PREFIXO"  , "RXP"                                                                             , NIL },;
                                { "E2_NUM"      , cValToChar(oJson:expenses[nDesp]:id)                                               , NIL },;
                                { "E2_TIPO"     , "PR"                                                                              , NIL },;
                                { "E2_NATUREZ"  , "IRF"                                                                             , NIL },;
                                { "E2_FORNECE"  , cForn                                                                               , NIL },;
                                { "E2_EMISSAO"  , dDatabase                                                                            , NIL },;
                                { "E2_VENCTO"   , dDatabase                                                                            , NIL },;
                                { "E2_VENCREA"  , dDatabase                                                                            , NIL },;
                                { "E2_VALOR"    , oJson:expenses[nDesp]:approved_amount                                                , NIL },;
                                { "E2_HIST"     , oJson:expenses[nDesp]:description+" ("+oJson:expenses[nDesp]:receiver:name+")"    , NIL } }

                    MsExecAuto( { |x,y,z| FINA050(x,y,z)}, aArray,, 3)  // 3 - Inclusao, 4 - Alteração, 5 - Exclusão

                    If lMsErroAuto
                        mostraerro()
                        Return .F.
                    EndIf 

                EndIf

            EndIf

    Next nDesp

Return .T.
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do SigaOAdvpl!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags ou faça a sua própria pergunta.