FAQs - Suporte técnico

Cross Segmento - TOTVS Backoffice (Linha Protheus) - ADVPL - Em um WS REST, definir a quantidade de informação retornada em um método GET

Dúvida
No retorno da consulta- método GET, precisamos retornar vários campos em torno de 70 e vários cadastros de cliente conforme o filtro solicitado. Qual o limite do retorno, tem alguma parametrização específica na configuração do serviço para este retorno? Existe alguma forma de desenvolvimento a cada SetResponse como se fosse um retorno para aplicação que solicitou?


Ambiente
Cross Segmento - TOTVS Backoffice (Linha Protheus) – ADVPL– A partir da versão 11.80

Solução
Com relação aos limites de retorno, não está relacionado ao web service em si, mas com as limitações da linguagem ADVPL, vide documentações em Saiba mais.

Com relação a necessidade levantada, o que pode ser feito é definir a quantidade de páginas que a requisição irá retornar, bem como a quantidade de registros exibidos por página.
A seguir um exemplo de WS REST com um método GET, utilizando o cadastro de clientes(SA1), para referência;

#INCLUDE "PROTHEUS.CH"
#INCLUDE "RESTFUL.CH"

WSRESTFUL WSRESTA1 DESCRIPTION "Exemplo de serviço REST"

WSDATA page AS INTEGER OPTIONAL
WSDATA pageSize AS INTEGER OPTIONAL
WSDATA searchKey AS STRING OPTIONAL

WSMETHOD GET customers DESCRIPTION "Retorna lista de clientes" WSSYNTAX "/customers " PATH 'customers' PRODUCES APPLICATION_JSON

END WSRESTFUL

//-------------------------------------------------------------------
/*/{Protheus.doc} GET / customers
Retorna a lista de clientes.

@param SearchKey , caracter, chave de pesquisa utilizada em diversos campos
Page , numerico, numero da pagina
PageSize , numerico, quantidade de registros por pagina

@return cResponse , caracter, JSON contendo a lista de clientes
/*/
//-------------------------------------------------------------------

WSMETHOD GET customers WSRECEIVE searchKey, page, pageSize WSREST WSRESTA1

Local aListCli := {}

Local cAliasSA1 := GetNextAlias()
Local cJsonCli := ''
Local cSearchKey := ''
Local cSearch := ''
Local cWhere := "AND SA1.A1_FILIAL = '"+xFilial('SA1')+"'"

Local lRet := .T.

Local nCount := 0
Local nStart := 1
Local nReg := 0
Local nAux := 0

Local oJsonCli := JsonObject():New()

Default self:searchKey := ''
Default self:page := 1
Default self:pageSize := 10

//-------------------------------------------------------------------
// Tratativas para a chave de busca
//-------------------------------------------------------------------
If !Empty(self:searchKey)
cSearch := AllTrim( Upper( Self:SearchKey ) )
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_NOME LIKE '%" + cSearch + "%' ) "
EndIf

cWhere := '%'+cWhere+'%'

//-------------------------------------------------------------------
// Query para selecionar clientes
//-------------------------------------------------------------------
BEGINSQL Alias cAliasSA1

SELECT SA1.A1_COD, SA1.A1_LOJA, SA1.A1_NOME
FROM %table:SA1% SA1
WHERE SA1.%NotDel%
%exp:cWhere%

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 self:page > 1
nStart := ( ( self:page - 1 ) * self:pageSize ) + 1
nReg := nRecord - nStart + 1
Else
nReg := nRecord
EndIf

//-------------------------------------------------------------------
// Posiciona no primeiro registro.
//-------------------------------------------------------------------
( cAliasSA1 )->( DBGoTop() )

//-------------------------------------------------------------------
// Valida a exitencia de mais paginas
//-------------------------------------------------------------------
If nReg > self: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]['unit'] := ( cAliasSA1 )->A1_LOJA

If Len(aListCli) >= self:pageSize
Exit
EndIf

EndIf

( cAliasSA1 )->( DBSkip() )

End

( cAliasSA1 )->( DBCloseArea() )

oJsonCli['clients'] := aListCli

//-------------------------------------------------------------------
// Serializa objeto Json
//-------------------------------------------------------------------
cJsonCli:= FwJsonSerialize( oJsonCli )

//-------------------------------------------------------------------
// Elimina objeto da memoria
//-------------------------------------------------------------------
FreeObj(oJsonCli)

Self:SetResponse( cJsonCli ) //-- Seta resposta

Return( lRet )

A seguir como fica a requisição, limitando seu retorno a 1 página e apenas 2 registros nesta página;



Saiba mais
String size overflow
MaxStringSize
Melhoria - Proteções e limites do AdvPL
MaxQuerySize
ConsoleMaxSize

Esse artigo foi útil?
Usuários que acharam isso útil: 0 de 0

1 Comentários

  • Avatar
    Wanderson Fernandes de Souza

    Boa Tarde,

    Para que este exemplo fica como estou precisando, veja se vocês pode me ajudar

     oJsonCli['filial'    ] :='VESPOR RP'
     oJsonCli['empresa'] := 'XXXXXXXXXXXXXXXXXXXXXX'
     oJsonCli['clientes'         ] := aListCli
     
    o Resultado que eu preciso montar seria como acima ou seja 
    0
    Ações de comentário Permalink
Por favor, entre para comentar.
X Fechar

Olá ,

Há pendência referente a um de seus produtos contratados para a empresa ().

Entre em contato com o Centro de Serviços TOTVS para tratativa.

Ligue! 4003-0015 opção 4 e 9 ou registre uma solicitação para CST – Cobrança – Verificação de pendências financeiras . clique aqui.

TOTVS

X Fechar

Olá ,

Seu contato não está cadastrado no Portal do Cliente como um perfil autorizado a solicitar consultoria telefônica.

Por gentileza, acione o administrador do Portal de sua empresa para: (1)configurar o seu acesso ou (2)buscar um perfil autorizado para registro desse atendimento.

Em caso de dúvidas sobre a identificação do contato administrador do Portal, ligue (11) 4003-0015, opção 7 e, em seguida, opção 4 para buscar o suporte com o time de Assessoria ao Portal do Cliente. . clique aqui.

TOTVS

X Fechar

Olá ,

Para o atendimento de "Consultoria Telefônica" você deverá estar de acordo com o Faturamento.

TOTVS

X Fechar

Olá,

Algo inesperado ocorreu, e o usuario nao foi reconhecido ou você nao se encontra logado

Por favor realize um novo login

Em caso de dúvidas, entre em contato com o administrador do Portal de Clientes de sua empresa para verificação do seu usuário, ou Centro de Serviços TOTVS.

Ligue! 4003-0015 opção 4 e 9 ou registre uma solicitação para CST – Cadastros . clique aqui.

TOTVS

Chat _

Preencha os campos abaixo para iniciar o atendimento:

Chat _