Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Web Service REST

Produto:

TOTVS Automação Fiscal

Versões:

12.1.17+

Este documento tem o objetivo de fornecer informações para utilização do Web Service REST, para consulsta geral de status de consulta de elementos/registros do TOTVS Automação Fiscal, de acordo com o status ou tipo do registro.

Para mais detalhes sobre o conceito de um serviços REST clique aqui.

Para mais detalhes sobre serviços REST na arquitetura Protheus clique aqui. 

Índice

Índice
indent30px
absoluteUrltrue

Definição do Serviço

Nome: WSTAFQUERYSELECTORALLWSTAFQueryElements

Objetivo: Consultar o status de uma lista de elementos presentes na base de dados do TAF, através de um determinado parâmetrotipo pré-definido.

Descrição: O serviço permite, que uma aplicação faça uma consulta de status generalizada, para generalizada na base de dados do TOTVS Automação Fiscal, para obter uma série de registros/elementos , no TOTVS Automação Fiscal, através de um dado/parâmetro pré-definido pela própria aplicação.

Métodos: GET

Configurações do Serviço

 

tipo do registro ( de acordo com os tipos existentes no TAF ).

Métodos: GET


Configurações do Serviço

A Configuração A  Configuração do serviço REST está documentada  no link Configuração REST SERVER - Protheus.

Nota
titleImportante

Na Seção seção HTTPURI, a chave PrepareIn deve ser preenchida com o código da empresa/filial principal ou com "All" para todas os grupos de empresas empresas:

PrepareIn para grupo de empresa e filial específica
[HTTPURI]
URL=/rest
PrepareIn=99,01
Instances=1,1 
PrepareIn para grupo de empresa e empresa específica 
[HTTPURI]
URL=/rest
PrepareIn=T1,D MG 01
Instances=1,1 
PrepareIn para todas os grupos de empresas
[HTTPURI]
URL=/rest
PrepareIn=All
Instances=1,1 

Fonte: REST com ERP Microsiga Protheus

 

Definição dos métodos

 

GET

 

Descrição do Método: O método GET retorna os status dos registros integrados

comentada. A empresa principal deverá estar informada na seção [TAF_CFGJOB]. Não há necessidade da inclusão de mais empresas, pois o próprio WS fará esse controle. Para acessar as demais empresas, basta informar o CNPJ ( CGC ), Inscrição Estadual ( INSCEST ) e Inscrição Municipal ( INSCMUN ) no Header da requisição ao WS.

Segue exemplo de configuração do WS REST:

[HTTPV11]
SOCKETS=HTTPREST
ENABLE=1

[HTTPREST]
Port=8080
URIs=HTTPURI
Security=0

[HTTPURI]
URL=/rest
;PrepareIn=
Instances=1,1
CORSEnable=1
AllowOrigin=*

[HTTPJOB]
MAIN=HTTP_START
ENVIRONMENT=P12

[TAF_CFGJOB]
Main=TAF_CFGJOB
Instances=1,1
PrepareIn=T1
nRefreshRate=50
ENVIRONMENT=P12


[OnStart]
JOBS=HTTPJOB,TAF_CFGJOB
RefreshRate=120

Fonte: REST com ERP Microsiga Protheus


Definição dos métodos


GET


Descrição do Método:

O método GET retorna uma lista de elementos encontrados na base de dados, de acordo com os parâmetros ( atributos ) enviados na URL.

A Consulta pode combinar parâmetros utilizando a sintaxe “Query String”, conforme exemplo abaixo:

http://172.16.31.214:8085/rest/

wstafst2

wstafqueryelements?

ticketCode

status=

F95975312365478978936365524145236352

4&

RegistryKey

registryType=

KEYQWE7878RE4854545454998598571

S-1010&startRecNo=0

 

 


ParâmetroDescriçãoObrigatório
ticketCodeTAFTICKETOCregistryKeyTAFKEYOC
statusStatus do registro no TAF
registryTypeTipo do registro/layout. Exemplo: T007, S-1010...O
startRecNoRecNo inicial para consultaO
searchModeFiltro para buscaN

 

  • ticketCode – Código do TAFTICKET, Obrigatório caso registryKey não seja informado.
  • registryKey – Código do TAFKEY, Obrigatório caso ticketCode não seja informado.
  • startRecNo - Numero do RecNo Inicial a ser considerado na consulta. 
    Observação : O Tamanho máximo do Response é 850 kB, quando a mensagem chega neste valor é realizado um retorno contendo os registros que já foram incrementados na resposta. O Controle dos itens restantes é feito através do lastRecNo que informa o RecNo do ultimo registro que fez parte da mensagem anterior (respeitando a chave),  caso o mesmo seja diferente de maxRecNo é por que existem itens a serem retornados, caso o contrario a consulta está completa.
  • searchMode – Modo de pesquisa, quando não informado o response retorna todos os TAFKEYs relacionados a busca, quando igual a 1 retorna a última ocorrência do TAFKEY, quando igual a 2 retorna a última ocorrência válida do TAFKEY. Este parâmetro é útil quando o mesmo TAFKEY é enviado em vários TAFTICKET diferentes.

 

Estrutura da Resposta do método GET (Response):

 

Atributo

Pai

Nivel

Ocorrência

Formato

type

-

1

1

-

code

-

1

1:N

String(36-100)

Items

-

1

1

-

success

Items

2

1

boolean(true : false)

proccessed

Items

2

1

boolean(true : false)

description

Items

2

1

String(100)

sourceBranchCódigo Identificador da filial


    • status - Status do registro na base de dados do TAF. Os códigos válidos podem ser encontrados no Manual de Integração. Não é obrigatório.
      Observação: Para consultar Status que seja "em branco" deve-se inserir da seguinte maneira: status: ' '  ( aspas simples espaço aspas simples ). Exemplo:
      http://localhost:8080/rest/WSTAFQueryElements?status=' '&registryType=T001AE&startRecNo=0
      Ou
      http://localhost:8080/rest/WSTAFQueryElements?status=%27%20%27&registryType=T001AE&startRecNo=0
    • registryType - Tipo do registro ( código do campo TAFTPREG ). Obrigatório.
    • startRecNo - Número do RecNo Inicial a ser considerado na consulta.
    • sourceBranch - Código Identificador da filial do ERP emissor.


Observação : O Tamanho máximo do Response é 850kB, quando a mensagem chega neste valor, é realizado um retorno contendo os registros que já foram incrementados na resposta. O Controle dos itens restantes é feito através do lastRecNo, que informa o RecNo do ultimo registro que fez parte da mensagem anterior ( respeitando a chave ),  caso o mesmo seja diferente de maxRecNo é por que existem itens a serem retornados, caso o contrario a consulta está completa.


Estrutura da Resposta do método GET ( Response ):


AtributoPaiNívelOcorrênciaFormato

registryType

-

1

1

-

statusCode

-

1

registryKey

Items

2

0:1

String(

100

1)

ticketCode

Items

-

1

1

-

registryKey

Items

2

0:

1

String(

36

100)

errorCode

statusCode

Items

2

0:1

String(

6

1)

errorDescription

statusDescription

Items

2

0:1

String(

60

25)

errorDetail
validateErrorsItems20:1

String(220)

-

validateErrorCode

validateErrors

3

statusCode

Items

2

0:1

String(

1

6)

statusDescription

validateErrorDetail

Items

validateErrors

2

3

0:1

String(

25

220)

active
streamingErrorsItems20:1

boolean(true : false)

-

streamingErrorCode

streamingErrors

3

registryPriorityItems2

0:1

String(

1

6)

integrationQueue
streamingErrorDetail
Items

streamingErrors

2

3

0:1

String(220)

registryProtocol

Items

2

0:1

String(60)

lastRecNo-11Int(9999)
maxRecNo-11Int(9999)

 

  • type – Determina o agrupamento do retorno que pode ser por ticketCode (TAFTICKET) ou registryKey (TAFKEY), o agrupamento depende dos parâmetros enviados no request, quando o registryKey é informado e o ticketCode omitido, o  retorno será por registryKey caso contrário por ticketCode.
  • code – Código do registro indicado no atributo type.

    • registryType – Tipo do registro ( conforme campo TAFTPREG ).
    • statusCode – Status do registro no TAF, atributo exibido somente quando o parâmetro status for informado na requisição.
    • items – Itens do response.
  • success – informa que o envio do registro pelo método POST  foi realizado com sucesso.
  • proccessed – Informa se o registro foi processado (Job2) e integrado com sucesso no seu respectivo cadastro.
  • description – Descrição do status atual do registro.
  • registryKey – código do TAFKEY, esse atributo somente é exibido quando type for igual a ticketCode.
  • ticketCode – código do TAFTICKET, esse atributo somente é exibido quando type for igual a registryKey.
  • errorCodeCódigo do erro contido no campo TAFCODERR na tabela TAFXERP, atributo exibido somente quando proccessed for igual a false.
  • errorDescription – Descrição do errorCode, atributo exibido somente quando proccessed for igual a false.
  • errorDetail – Detalhes do erro, alguns tipos de erros possuem detalhes e são armazenados no campo TAFERR na tabela TAFXERP, atributo exibido somente quando proccessed for igual a false.
  • statusCode – Status do registro no TAF, atributo exibido somente quando proccessed for igual a true.
  • statusDescription – Descrição do status no TAF, atributo exibido somente quando proccessed for igual a true.
  • active – Informa se o registro está ativo no TAF, atributo exibido somente quando proccessed for igual a true.
  • registryPriority: Retornar a prioridade definida para o registro, atributo exibido somente quando proccessed for igual a false.
    • registryKey – código do TAFKEY. Essa informação sempre será retornada, para que a aplicação de origem consiga identificar o registro em sua própria base de dados.
    • statusCode – Status do registro no TAF, atributo exibido somente quando o parâmetro status não for informado na requisição.
    • statusDescription – Descrição do status no TAF, atributo exibido somente quando o parâmetro status não for informado na requisição.
    • validateErrors – Agrupa todos os erros de layout identificado pelo processo de validação do TAF. Os erros são listados por validateErrorCode e validateErrorDetail.
    • validateErrorCode – Código do erro identificado pelo processo de validação do TAF.
    • validateErrorDetail – Descrição do erro identificado pelo processo de validação do TAF.
    • streamingErrors – Agrupa todos os erros de transmissão retornados do Governo para o TAF. Os erros são listados por streamingErrorCode e streamingErrorDetail.
    • streamingErrorCode – Código do erro retornado pelo Governo para o TAF, após transmissão do registro.
    • streamingErrorDetail – Descrição do erro retornado pelo Governo para o TAF, após transmissão do registro.
    • registryProtocol – Recibo retornado do Governo para o TAF após a transmissão do registro ter sido realizada com sucesso
    integrationQueue: Retorna o status de fila do registro. Retorna branco quando o registro não foi definido para integração utilizando fila de processamento (atributo integrationQueue do método POST), retorna 'F' quando o registro foi retornado para a fila de processamento ou 'R' quando o erro da integração é impeditivo e o registro foi rejeitado pelo TAF. Atributo exibido somente quando proccessed for igual a false 
    • .
    • lastRecNo - Numero do RecNo do ultimo registro retornado na requisição.
    • maxRecNo - Informa o numero do RecNo do ultimo registro relacionado a consulta, deve ser utilizado juntamente com o lastRecNo para controlar a paginação e garantir o retorno de todos os registros.



    Exemplos de requisição utilizando o método GET:

     


    Consulta

    pelo ticketCode

    sem informar o STATUS:


    Request:

    GET http://

    172.16.31.214:8085

    localhost:8080/rest/

    wstafst2

    WSTAFQueryElements?

    ticketCode

    registryType=

    WIO9753123654789789363655241452363

    T011&startRecNo=

    0

    70 HTTP/1.1

    Accept-Encoding: gzip,deflate
    Host: localhost:8080
    Connection: Keep-Alive
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)


    Bloco de código
    languagejs
    themeEclipse
    titleResponse:
      

     

     

    Bloco de código
    languagejs
    themeEclipse
    titleResponse:
    {
       "
    type
    registryType": "
    ticketCode
    T011",
       "
    code
    itens": 
    "WIO9753123654789789363655241452363",
      
    "items":
     [
        
    {
           
    "success": true,
     {
             "
    proccessed
    registryKey": 
    false
    "20170620141315DMG01_0000000571",
             "
    description
    statusCode": "
    Aguardando Processamento.
    0",
             "
    registryKey
    statusDescription": "
    KEYIO7878874854545454998598525"
    Registro validado pelo TAF"
          },
          
    "errorCode": "",
          {
             "
    errorDescription
    registryKey": "20170620141315DMG01_0000000572",
             "
    errorDetail
    statusCode": "0"
    }
    ,
    
       
    {
          "
    success
    statusDescription":
    true,
     "Registro validado pelo TAF"
          
    "proccessed": false
    },
          
    "description":
     
    "Aguardando
     
    Processamento.",
        {
      
    "registryKey":
     
    "KEYYZE7878RE4854545454998598576",
          "
    errorCode
    registryKey": "20170620141315DMG01_0000000573",
             "
    errorDescription
    statusCode": "0",
             "
    errorDetail
    statusDescription": "Registro validado pelo TAF"
          },
     
    ],
      
    "lastRecNo": 82, "maxRecNo": 82 }

     

     

    Bloco de código
    languagejs
    themeEclipse
    titleResponse após a execução do processamento:
    { "type": "ticketCode
             {
             "registryKey": "20170620141315DMG01_0000000574",
      
    "code
           "statusCode": "
    WIO9753123654789789363655241452363
    0",
       
    "items": [
     
    {
         
    "
    success
    statusDescription": 
    true,
    "Registro validado pelo 
    "proccessed": false,
    TAF"
          
    "description": "Registro Inconsistente.",
    }
       
    "registryKey": "KEYIO7878874854545454998598525"
    ],
       
    "
    errorCode
    lastRecNo": 
    "000007"
    73,
    
       "
    errorDescription
    maxRecNo": 
    "A operacao solicitada no XML esta em desacordo com o cenario do registro na base do TAF", "errorDetail": "" }, { "success": true, "proccessed": true, "description": "Registro Processado.", "registryKey": "KEYYZE7878RE4854545454998598576",
    73
    }


    Consulta informando o STATUS:


    Request:

    GET http://localhost:8080/rest/WSTAFQueryElements?status=1&registryType=S-1060&startRecNo=0 HTTP/1.1
    Accept-Encoding: gzip,deflate
    Host: localhost:8080
    Connection: Keep-Alive
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)


    Bloco de código
    languagejs
    themeEclipse
    titleResponse após a execução do processamento:
    {
       "registryType": "S-1060",
       "statusCode": "
    1",
       "itens":    [
                {
             "
    statusDescription
    registryKey": "
    Registro
    Inclusão 
    Integrado
    Manual",
             "
    active
    validateErrors":     
    true
        
    }
     [
     
    ],
       
    "lastRecNo":
     
    82,
      
    "maxRecNo": 82 }

    Observação: O exemplo acima contem os 2 tipos de retorno possíveis para um TAFKEY, o atributo proccessed define se vão ser apresentados os atributos de Erro ou de Sucesso conforme descrito acima na tabela de estrutura da resposta do método GET.

     

    • Consulta pelo ticketCode + registryKey:

    Request:

    http://172.16.31.214:8085/rest/wstafst2?ticketCode=WIO9753123654789789363655241452363&RegistryKey=KEYYZE7878RE4854545454998598576&startRecNo=0

     
    Bloco de código
    languagejs
    themeEclipse
    titleResponse:
    { "type": "ticketCode", "code": "WIO9753123654789789363655241452363", "items": [ { "success": true
                     {
                   "validateErrorCode": "000692",
                   "validateErrorDetail": "Cadastro de Ambientes de Trabalho - Campo: Tp.Inscrição (T04_TPINSC) - Se empregador PJ, o campo tipo de inscrição deve ser CNPJ (1)."
                },
          
    "proccessed":
     
    false,
          
    "description":
     
    "Aguardando
     
    Processamento
     
    do
     
    Job2.",
          
    "registryKey": "KEYYZE7878RE4854545454998598576",
     {
          
    "errorCode": "",
             "
    errorDescription
    validateErrorCode": "000693",
          
    "errorDetail":
     
    ""
        
    }
      
    ],
      "
    lastRecNo
    validateErrorDetail":
    81, "maxRecNo": 81 }
    Aviso
    titleAtenção!

    Quando a consulta for por ticketCode + registryKey o retorno será agrupado por ticketCode.

     

    • Consulta pelo registryKey:

    Request:

    http://172.16.31.214:8085/rest/wstafst2?registryKey=KEYYZE7878RE4854545454998598576&startRecNo=0

    Bloco de código
    languagejs
    themeEclipse
    titleResponse:
    { "type": "registryKey", "code": "KEYYZE7878RE4854545454998598576", "items": [ {
     "Cadastro de Ambientes de Trabalho - Campo: Nr.Insc. (T04_NRINSC) - Se o Local Amb. for próprio do empregador ({localAmb} = [1]), o estabelecimento deve pertencer ao empregador e constar da tabela S-1005."
          
    "success": true,
          }
      
    "proccessed":
     
    false,
          
    "description": "Aguardando Processamento do Job2.",
    ]
          },
            
    "ticketCode": "WIO9753123654789789363655241452363",
        {
             "
    errorCode
    registryKey": "Inclusão Manual",
             "
    errorDescription
    validateErrors":
    "",
              [
                  
    "errorDetail":
     
    ""
        
    }
      
    ],
      
    "lastRecNo": 80,
     {
      
    "maxRecNo": 80 }

     

    Controle de Paginação:

    Quando o retorno de uma requisição ultrapassa o valor de 850 Kb a mensagem de resposta é "quebrada" e retornada com o conteúdo até então incrementado, exemplo:

    Bloco de código
    themeEclipse
    titleExemplo de Paginação
    { "type
                 "validateErrorCode": "
    ticketCode
    000692",
        
    "code": "WIO9753123654789789363655241452363",
      
    "items":
     
    [
      
    {
          "
    success
    validateErrorDetail": 
    true,
    "Cadastro de Ambientes de Trabalho - 
    "proccessed"
    Campo: 
    false, "description": "Aguardando Processamento", "registryKey": "KEYIO7878874854545454998598525",
    Tp.Inscrição (T04_TPINSC) - Se empregador PJ, o campo tipo de inscrição deve ser CNPJ (1)."
               
    "errorCode": ""
     },
          
    "errorDescription": "",
            
    "errorDetail":
     
    ""
        
    }, * * * {several
     
    items} * * *
        {
          
    "success": true,
             "
    proccessed
    validateErrorCode": 
    false
    "000693",
          
    "description": "Aguardando Processamento",
             "
    registryKey
    validateErrorDetail": "
    KEYQIU7878RE4854545454998598544",
    Cadastro de Ambientes de Trabalho - 
    "errorCode"
    Campo: 
    "", "errorDescription": "", "errorDetail": "
    Nr.Insc. (T04_NRINSC) - Se o Local Amb. for próprio do empregador ({localAmb} = [1]), o estabelecimento deve pertencer ao empregador e constar da tabela S-1005."
                }
             ]
    ,
    
        
    "lastRecNo": 150
      },
      
    "maxRecNo": 322 }

    No exemplo acima a consulta retornou até o registro 150, sendo que o registro com maior RecNo pertencente a consulta é o 322, isso não quer dizer que foram retornados 150 registros e que faltam 172, o RecNo apenas informa a sequencia do registro na tabela TAFST2 porém o lastRecNo menor que o maxRecNo indica que ainda existem registro a serem retornados para a chave requisitada. Para o retorno dos demais registros deve-se realizar uma nova requisição com o startRecNo igual a lastRecNo + 1, este procedimento deve ser adotado  até que o lastRecNo seja igual ao maxRecNo conforme exemplo abaixo:

     

    Request:

    http://172.16.31.214:8085/rest/wstafst2?ticketCode=WIO9753123654789789363655241452363&startRecNo=151

     

    Bloco de código
    themeEclipse
    titleResponse
    { "type": "ticketCode", "code": "WIO9753123654789789363655241452363", "items": [ { "success": true, "proccessed": false,
              {
             "registryKey": "T1D MG 01_S-1060_20170626_1514430001.XML",
             "validateErrors": [         {
                "validateErrorCode": "000693",
                "validateErrorDetail": "Cadastro de Ambientes de Trabalho - Campo: Nr.Insc. (T04_NRINSC) - Se o Local Amb. for próprio do empregador ({localAmb} = [1]), o estabelecimento deve pertencer ao empregador e constar da tabela S-1005."
             }]
          },
                {
             "
    description
    registryKey": "
    Aguardando Processamento
    T1D MG 01_S-1060_20170626_1514430002.XML",
             "
    registryKey
    validateErrors":
    "KEYIO7878874854545454998598888",
     [        
    "errorCode": "",
     {
          
    "errorDescription
          "validateErrorCode": "000693",
          
    "errorDetail
          "validateErrorDetail": "
    "
    Cadastro de Ambientes 
    }, * * * {several items} * * * { "success": true, "proccessed": false, "description": "Aguardando Processamento",
    de Trabalho - Campo: Nr.Insc. (T04_NRINSC) - Se o Local Amb. for próprio do empregador ({localAmb} = [1]), o estabelecimento deve pertencer ao empregador e constar da tabela S-1005."
          
    "registryKey": "KEYQIU7878RE4854545454998598987",
       }]
          
    "errorCode": ""
    },
          
    "errorDescription":
     
    "",
         {
     
    "errorDetail":
     
    ""
        
    }
      
    ],
     "
    lastRecNo
    registryKey": 
    322, "maxRecNo": 322 }

     

    "T1D MG 01_S-1060_20170626_1514430003.XML",
             "validateErrors": [         {
                "validateErrorCode": "000694",
                "validateErrorDetail": "Cadastro de Ambientes de Trabalho - Campo: Nr.Insc. (T04_NRINSC) - Se o Local Amb. de terceiros ({localAmb} = [2]), a raiz do CNPJ pode ser diferente da constante no S-1000, porém deve constar na Tabela de Lotações Tributárias (S-1020)."
             }]
          }
       ],
       "lastRecNo": 5,
       "maxRecNo": 5
    }


    Controle de Paginação:


    Quando o retorno de uma requisição ultrapassa o valor de 850 Kb a mensagem de resposta é "quebrada" e retornada com o conteúdo até então incrementado, exemplo:


    Bloco de código
    themeEclipse
    titleExemplo de Paginação
    {
       "registryType": "S-2200",
       "statusCode": "1",
      "items": [
        {
          "registryKey": "KEY000001S-220020170101",
          "registryProtocol": "20170520081000S2200"
        },
    *
    *
    *
    {several items}
    *
    *
    *
        {
          "registryKey": "KEY000150S-220020170101",
          "registryProtocol": "20170521151402S2200"
        }
      ],
      "lastRecNo": 150,
      "maxRecNo": 322
    }


    No exemplo acima, a consulta retornou até o registro 150, sendo que o registro com maior RecNo pertencente a consulta é o 322, isso não quer dizer que foram retornados 150 registros e que faltam 172, o RecNo apenas informa a sequencia do registro no response, porém o lastRecNo menor que o maxRecNo indica que ainda existem registro a serem retornados para a chave requisitada. Para o retorno dos demais registros deve-se realizar uma nova requisição com o startRecNo igual a lastRecNo + 1, este procedimento deve ser adotado  até que o lastRecNo seja igual ao maxRecNo, conforme exemplo abaixo:


    Request:

    GET http://localhost:8080/rest/WSTAFQueryElements?status=1&registryType=S-2200&startRecNo=151 HTTP/1.1
    Accept-Encoding: gzip,deflate
    Host: localhost:8080
    Connection: Keep-Alive
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)


    Bloco de código
    themeEclipse
    titleResponse
    {
       "registryType": "S-2200",
       "statusCode": "1",
      "items": [
    

     

    Exemplo de Consumo do Serviço

     

    Bloco de código
    languagedelphi
    themeEclipse
    titleClient REST
    #Include 'Protheus.ch'
    Function WSCTAFST2(cMetodo)
    	Local oRestClient := FWRest():New("http://172.16.31.214:8085")
    	Local oObj   	:= Nil
    	Local aHeader := {}
    	Local cBody	:= {}
    	Local lContinue := .T.
    	Local nPag		:= 0
    	Local nRec		:= 0
    	
    	// inclui o campo Authorization no formato <usuario>:<senha> na base64
    	Aadd(aHeader, "Authorization: Basic " + Encode64("usertotvs:totvs123456"))
    	
    	If cMetodo == 'POST'
    	
    		oRestClient:setPath("/rest/wstafst2/")
    		
    		cBody := '{'
    		cBody += '"ticketCode": "WIO9753123654789789363655241452363",'
    		cBody += '"lote": ['
    		cBody += '{'
    		cBody += '"sourceBranch": "0100",'	
    		cBody += '"messageType": "2",''
    		cBody += '"messageSequential": "001",'
    		cBody += '"registryType": "S-1010",'
    		cBody += '"registryKey": "KEYIO7878874854545454998598525",'
    		cBody += '"integrationMessage": "PGVTb2NpYWw+PGV2dFRhYlJ1YnJpY2EgaWQ9J1MtMTAxMDEzMDUyMDE2MTU0MDE2JyB2ZXJzYW89JzEuMSc+PGlkZUV2ZW50bz48dHBBbWI+MzwvdHBBbWI+PHByb2NFbWk+MTwvcHJvY0VtaT48dmVyUHJvYz48L3ZlclByb2M+PC9pZGVFdmVudG8+PGlkZUVtcHJlZ2Fkb3I+PHRwSW5zYz4xPC90cEluc2M+PG5ySW5zYz41Mz'
    		cBody += 'ExMzc5MTAwMDEyMjwvbnJJbnNjPjwvaWRlRW1wcmVnYWRvcj48aW5mb1J1YnJpY2E+PGFsdGVyYWNhbz48aWRlUnVicmljYT48Y29kUnVicj45OTg8L2NvZFJ1YnI+PGluaVZhbGlkPjIwMTYtMDM8L2luaVZhbGlkPjwvaWRlUnVicmljYT48ZGFkb3NSdWJyaWNhPjxkc2NSdWJyPkJBU0UgUEVOU0FPIFBHVE88L2RzY1J1YnI+PG5hdFJ1YnI+OTk4OTwvbmF'
    		cBody += '0UnVicj48dHBSdWJyPjM8L3RwUnVicj48Y29kSW5jQ1A+MDA8L2NvZEluY0NQPjxjb2RJbmNJUlJGPjAwPC9jb2RJbmNJUlJGPjxjb2RJbmNGR1RTPjAwPC9jb2RJbmNGR1RTPjxjb2RJbmNTSU5EPjAwPC9jb2RJbmNTSU5EPjxyZXBEU1I+TjwvcmVwRFNSPjxyZXAxMz5OPC9yZXAxMz48cmVwRmVyaWFzPk48L3JlcEZlcmlhcz48cmVwUmVzYz5OPC9yZXBS'
    		cBody += 'ZXNjPjwvZGFkb3NSdWJyaWNhPjwvYWx0ZXJhY2FvPjwvaW5mb1J1YnJpY2E+PC9ldnRUYWJSdWJyaWNhPjwvZVNvY2lhbD4=",'
    		cBody += '"integrationDate": "20161005",'
    		cBody += '"integrationTime": "14:15:36"'
    		cBody += '},'
    		cBody += '{'
    		cBody += '"sourceBranch": "0100",'
    		cBody += '"messageType": "2",'
    		cBody += '"messageSequential": "001",'
    		cBody += '"registryType": "S-2100",'
    		cBody += '"registryKey": "KEYYZE7878RE4854545454998598576",'
    		cBody += '"integrationMessage": "PGVTb2NpYWw+PGV2dENhZEluaWNpYWwgSWQ9J0lEMTUzMTEzNzkxMDAwMDAwMjAxNjEyMDkxNDU5NTQwMDAwMSc+PGlkZUV2ZW50bz48aW5kUmV0aWY+MTwvaW5kUmV0aWY+PG5yUmVjaWJvPjwvbnJSZWNpYm8+PHRwQW1iPjM8L3RwQW1iPjxwcm9jRW1pPjE8L3Byb2NFbWk+PHZlclByb2M+MS4wPC92ZXJQcm9jPjwvaWRlRXZ'
    		cBody += 'lbnRvPjxpZGVFbXByZWdhZG9yPjx0cEluc2M+MTwvdHBJbnNjPjxuckluc2M+NTMxMTM3OTE8L25ySW5zYz48L2lkZUVtcHJlZ2Fkb3I+PHRyYWJhbGhhZG9yPjxjcGZUcmFiPjMyMDA5MDM3ODQ2PC9jcGZUcmFiPjxuaXNUcmFiPjEyMjAzNjcxODQ0PC9uaXNUcmFiPjxubVRyYWI+IEdUIFhNQlBFUkhVSlpOQ1FGU0lWTEFPRDwvbm1UcmFiPjxzZXhvPk08L'
    		cBody += '3NleG8+PHJhY2FDb3I+MTwvcmFjYUNvcj48ZXN0Q2l2PjI8L2VzdENpdj48Z3JhdUluc3RyPjwvZ3JhdUluc3RyPjxuYXNjaW1lbnRvPjxkdE5hc2N0bz4xOTc2LTA0LTEzPC9kdE5hc2N0bz48Y29kTXVuaWM+MTIwMDEwNTwvY29kTXVuaWM+PHVmPlNQPC91Zj48cGFpc05hc2N0bz4wMTM8L3BhaXNOYXNjdG8+PHBhaXNOYWM+MDEzPC9wYWlzTmFjPjxubU1'
    		cBody += 'hZT5ORVVTQSBDQVJWQUxITyBORVZFUzwvbm1NYWU+PG5tUGFpPkpPU0UgUkVZTkFMRE8gQ1JFU1BPIE5FVkVTPC9ubVBhaT48L25hc2NpbWVudG8+PGRvY3VtZW50b3M+PENUUFM+PG5yQ3Rwcz4wMDAzNTgwMDwvbnJDdHBzPjxzZXJpZUN0cHM+MDAwNzM8L3NlcmllQ3Rwcz48dWZDdHBzPlNQPC91ZkN0cHM+PC9DVFBTPjxSRz48bnJSZz4xNi43MjEuMDMwP'
    		cBody += 'C9uclJnPjxvcmdhb0VtaXNzb3I+U1NQPC9vcmdhb0VtaXNzb3I+PGR0RXhwZWQ+MTk4Mi0wMy0wMjwvZHRFeHBlZD48L1JHPjxDTkg+PG5yUmVnQ25oPjAwMDAwMDAwMDA8L25yUmVnQ25oPjx1ZkNuaD48L3VmQ25oPjxkdFZhbGlkPjwvZHRWYWxpZD48Y2F0ZWdvcmlhQ25oPjwvY2F0ZWdvcmlhQ25oPjwvQ05IPjwvZG9jdW1lbnRvcz48ZW5kZXJlY28+PGV'
    		cBody += '4dGVyaW9yPjxwYWlzUmVzaWQ+MDEzPC9wYWlzUmVzaWQ+PGRzY0xvZ3JhZD5BTEJBPC9kc2NMb2dyYWQ+PG5yTG9ncmFkPjE0NDQ8L25yTG9ncmFkPjxiYWlycm8+UFEuIEpBQkFRVUFSQTwvYmFpcnJvPjxubUNpZD5TQU4gTFVJWjwvbm1DaWQ+PGNvZFBvc3RhbD4wNDM0NjAwMDwvY29kUG9zdGFsPjwvZXh0ZXJpb3I+PC9lbmRlcmVjbz48aW5mb0RlZmlja'
    		cBody += 'WVuY2lhPjxkZWZGaXNpY2E+TjwvZGVmRmlzaWNhPjxkZWZWaXN1YWw+TjwvZGVmVmlzdWFsPjxkZWZBdWRpdGl2YT5OPC9kZWZBdWRpdGl2YT48ZGVmTWVudGFsPk48L2RlZk1lbnRhbD48ZGVmSW50ZWxlY3R1YWw+TjwvZGVmSW50ZWxlY3R1YWw+PHJlYWJSZWFkYXA+TjwvcmVhYlJlYWRhcD48L2luZm9EZWZpY2llbmNpYT48YXBvc2VudGFkb3JpYT48dHJ'
    		cBody += 'hYkFwb3NlbnQ+TjwvdHJhYkFwb3NlbnQ+PC9hcG9zZW50YWRvcmlhPjxjb250YXRvPjxmb25lUHJpbmM+MDAxMzQ3MzU1NTUgLzwvZm9uZVByaW5jPjxmb25lQWx0ZXJuYXQ+MDExNzg5Nzk4Nzk4PC9mb25lQWx0ZXJuYXQ+PGVtYWlsQWx0ZXJuYXQ+UkVZTkFMRE9ASE9UTUFJTC5DT008L2VtYWlsQWx0ZXJuYXQ+PC9jb250YXRvPjwvdHJhYmFsaGFkb3I+P'
    		cBody += 'HZpbmN1bG8+PG1hdHJpY3VsYT4wMDAwMDAwMDAwMDAwMDAwMDAwNzwvbWF0cmljdWxhPjx0cFJlZ1RyYWI+MTwvdHBSZWdUcmFiPjx0cFJlZ1ByZXY+MTwvdHBSZWdQcmV2PjxpbmZvUmVnaW1lVHJhYj48L2luZm9SZWdpbWVUcmFiPjxpbmZvQ29udHJhdG8+PGNvZENhdGVnPjMwMjwvY29kQ2F0ZWc+PHJlbXVuZXJhY2FvPjx2clNhbEZ4PjEwMDAuMDA8L3Z'
    		cBody += 'yU2FsRng+PHVuZFNhbEZpeG8+NTwvdW5kU2FsRml4bz48L3JlbXVuZXJhY2FvPjxkdXJhY2FvPjx0cENvbnRyPjE8L3RwQ29udHI+PC9kdXJhY2FvPjxsb2NhbFRyYWJhbGhvPjwvbG9jYWxUcmFiYWxobz48L2luZm9Db250cmF0bz48L3ZpbmN1bG8+PC9ldnRDYWRJbmljaWFsPjwvZVNvY2lhbD4=",'
    		cBody += '"integrationDate": "",'
    		cBody += '"integrationTime": ""'
    		cBody += '}]'
    		cBody += '}'
    	
    		// define o conteúdo do body
    		oRestClient:SetPostParams(cBody)
    		 
    		If oRestClient:Post(aHeader)
    		   ConOut("POST", oRestClient:GetResult())
    		Else
    		   ConOut("POST", oRestClient:GetLastError())
    		EndIf
    		
    	ElseIf cMetodo == "GET"
    	
    		While lContinue
    			nPag++
    			oRestClient:setPath("/rest/wstafst2?TicketCode=WIO9753123654789789363655241452363&startRecNo=" + AllTrim(Str(nRec)))
    			If oRestClient:Get(aHeader)
    				ConOut("Pag: " + AllTrim(Str(nPag)))
    			   	ConOut("GET", oRestClient:GetResult())
    			  	
    				If FWJsonDeserialize(oRestClient:GetResult(),@oObj)
    			   		If oObj:lastRecNo == oObj:maxRecNo
    			   			lContinue := .F.
    			   		Else
    			   			nRec := oObj:lastRecNo+1
    			   		EndIf
    			   	EndIf
    			   	oObj := Nil
    			Else
    			   ConOut("GET", oRestClient:GetLastError())
    			   lContinue := .F.
    			EndIf
    		End
    		ConOut("------FIM------")
    	ElseIf cMetodo == "DELETE"
    		
    		cBody := '{"deleteTicket" : [{"ticketCode":"WIO9753123654789789363655241452363"}'
    		cBody += ',{"ticketCode":"UIO9753123654789789363655241452363"}]}'
    		If oRestClient:Delete(aHeader,cBody)
    		   ConOut("DELETE", oRestClient:GetResult())
    		Else
    		   ConOut("DELETE", oRestClient:GetLastError())
    		EndIf
    		
    	Else
    		ConOut("Método Inválido")
    	EndIf
    	
    	FreeObj(oRestClient)
    Return 
    Bloco de código
    languagejs
    themeEclipse
    titleExemplo de Resposta do método GET com RESTFAULT
      "errorCode": 101,
      "errorMessage": "obrigatorio o envio do parametro ticketCode ou registryKey"
    }

     

    Códigos De Erros De Validação:

     

    • 800 – Campo não informado na estrutura do arquivo.
    • 801 – Campo obrigatório não enviado.
    • 802 – Campo com valor inválido.
    • 803 – TAFFIL não encontrado no complemento de empresas.
    • 804 – Layout Inválido.
    • 805 – Código de Prioridade inválido!
    • 806 – Campo com erro na codificação ou criptografia
    • 807 – Código de Fila inválido!
    • 808 – Estrutura da tabela TAFST2 está desatualizada

     

    Bloco de código
    languagejs
    titleExemplo de mensagem POST:Exemplo de Resposta do método POST com erro de validação:
    { "ticketCode": "WIO9753123654789789363655241452363", "registryKey": [ { "key": "KEYIO7878874854545454998598525", "success": false, "error": [
        {
          
    "
    coderr
    registryKey": 
    801
    "KEY000151S-220020170101",
          
    "
    description
    registryProtocol": "
    Campo TAFFIL (sourceBranch) e Obrigatorio.
    201705206912365S2200"
    
        },
    *
    *
    *
    {several items}
    *
    *
    *
        
    {
    
          "
    coderr
    registryKey": 
    803
    "KEY000322S-220020170101",
    
          
    "
    description
    registryProtocol": "
    O
    20170529875302S2200"
     
    valor
     
    do
     
    campo
     
    TAFFIL
    }
     
    (sourceBranch)
     ],
     
    nao
     "lastRecNo": 322,
      "maxRecNo": 322
    }
    



    Exemplo de Consumo do Serviço


    Bloco de código
    languagedelphi
    themeEclipse
    titleClient REST
    #Include 'Protheus.ch'
    Function WSCTAFST2(cMetodo)
    	Local oRestClient := FWRest():New("http://172.16.31.214:8085")
    	Local oObj   	:= Nil
    	Local lContinue := .T.
    	Local nPag		:= 0
    	Local nRec		:= 0
    	Local cLayout  := "S-1060"
    	Local aHeader := {"CGC: 43211325000126","INSCEST: 0621608450090"}	
    	If cMetodo == "GET"
    	
    		While lContinue
    			nPag++
    			oRestClient:setPath("/rest/wstafqueryelements?status=1&registryType="+ cLayout +"&startRecNo=" + AllTrim(Str(nRec)))
    			If oRestClient:Get(aHeader)
    				ConOut("Pag: " + AllTrim(Str(nPag)))
    			   	ConOut("GET", oRestClient:GetResult())
    			  	
    				If FWJsonDeserialize(oRestClient:GetResult(),@oObj)
    			   		If oObj:lastRecNo == oObj:maxRecNo
    			   			lContinue := .F.
    			   		Else
    			   			nRec := oObj:lastRecNo
    			   		EndIf
    			   	EndIf
    			   	oObj := Nil
    			Else
    			   ConOut("GET", oRestClient:GetLastError())
    			   lContinue := .F.
    			EndIf
    		End
    		ConOut("------FIM------")
    	EndIf
    	
    	FreeObj(oRestClient)
    Return esta cadastro no complemento de empresas."
            }
           {
              "coderr": 805,
              "description": "Codigo de Prioridade invalido! Codigo enviado: '8'. Codigos validos: 0 - Urgente, 1 - Prioridade Critica, 2 - Prioridade Alta, 3 - Prioridade Media, 4 - Prioridade Baixa, 5 - Nao Prioritario"
            }
          ]
        },
        {
          "key": "KEYYZE7878RE4854545454998598576",
          "success": true
        },
        {
          "key": "KEYQWE7878RE4854545454998598571",
          "success": true
        },
        {
          "key": "KEYQIU7878RE4854545454998598544",
          "success": true
        }
      ],
      "keyAmount": 4
    }
    Bloco de código
    languagejs
    themeEclipse
    titleExemplo de Resposta do método GET com RESTFAULT
      "errorCode": 101,
      "errorMessage": "obrigatorio o envio do parametro ticketCode ou registryKeyregistryType"
    }

     

     


    Códigos De Erros De Validação:


    800 – Status (status) solicitado no request é inválido.

    801 – Tipo de registro (registryType) solicitado no request é inválido.