Versão atual:

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.

Versões (2):

Ver a versão formatada

Consumindo uma API com Rest

Comentário

new question