Duvida Google Cloud Message

Discussão em 'Progress 4GL' iniciado por erickles, Março 16, 2016.

  1. erickles

    erickles Membro Participativo

    Bom dia pessoal,

    Estou fazendo testes no Google Cloud Message para o envio de push notifications em um aplicativo da empresa e consigo fazer com total sucesso. O problema mesmo é tratar o retorno do JSON. Estou tentando o código abaixo e não entendo o que esta errado, estou seguindo as instruções do próprio help do progress:

    Código:
    DEFINE INPUT PARAMETER cTitle   AS CHARACTER NO-UNDO.
        DEFINE INPUT PARAMETER cMessage AS CHARACTER NO-UNDO.
        DEFINE INPUT PARAMETER gcmId    AS CHARACTER NO-UNDO.
    
        DEFINE VARIABLE cSourceType AS CHARACTER NO-UNDO.
        DEFINE VARIABLE lRetOK      AS LOGICAL   NO-UNDO.
        DEFINE VARIABLE ttRetorno       AS HANDLE    NO-UNDO.
        DEFINE VARIABLE cReadMode   AS CHARACTER NO-UNDO.
       
        DEFINE VARIABLE strURL AS LONGCHAR   NO-UNDO.
        ASSIGN strURL       = "https://android.googleapis.com/gcm/send"
               cSourceType  = "LONGCHAR"
               cReadMode    = "MERGE".
    
        /* Variaveis da consulta ao webservice */
        DEFINE VARIABLE http        AS COM-HANDLE.
        DEFINE VARIABLE strRET      AS LONGCHAR.
        DEFINE VARIABLE cBody       AS CHARACTER   NO-UNDO.
    
        /* Le a informação do Retorno */
        CREATE "MSXML2.XMLHTTP.3.0" http NO-ERROR.
        http:OPEN("POST", strURL, FALSE).
        http:setRequestHeader("Authorization", "key=chave").
        http:setRequestHeader("Content-Type", "application/json").
        /*
        cBody = CHR(123) +
                    '"data": ' +
                        CHR(123) +
                            '"type":"'      + "1"              + '",' +
                            '"title":"'     + cTitle              + '",' +
                            '"message":"'   + cMessage             + '"' +
                        CHR(125)         + ',' +
    
                        '"to"' + ' : ' + '"' + gcmId + '"' +
                CHR(125).
        */
        cBody = CHR(123) +
                    '"data": ' +
                        CHR(123) +
                            '"type":"'      + "1"              + '",' +
                            '"title":"'     + cTitle              + '",' +
                            '"message":"'   + cMessage             + '"' +
                        CHR(125)         + ',' +
                        '"registration_ids"' + ' : ' + '[' + gcmId + ']' +
                CHR(125).
       
        http:SEND(cBody) NO-ERROR.
    
        /* Armazena o retorno */
        ASSIGN strRET = http:responseText.
       
        CREATE TEMP-TABLE ttRetorno.
        lRetOK = ttRetorno:READ-JSON(cSourceType, strRET, cReadMode).
        /* Se tiver erro, retorna o erro */
        MESSAGE lRetOK
                VIEW-AS ALERT-BOX INFO BUTTONS OK.
    Surge a mensagem: "Erro de parsing de JSON: esperado brace, mas localizado {. (15358)". Um "brace" não seria um "{" (abre chaves)?

    Meu retorno JSON:

    Código:
    {"multicast_id":4843864103390316820,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1457983611784970%431fdc73f9fd7ecd"}]}
    Se puderem ajudar, agradeço, realmente não entendo o que esta errado.
  2. rafael.andrade

    rafael.andrade Membro Master Moderador Equipe de Suporte

    O Progress possui tratativa nativa para JSON, dá uma pesquisada no HELP do Progress
  3. rlfritz

    rlfritz Membro Ativo

    O suporte ao JSON é a partir do Progress 11...

    "brace" não seria colchetes "[ ]" ?
  4. rlfritz

    rlfritz Membro Ativo

    ops... desculpa... tem read-json no progress 10.2b ...
  5. erickles

    erickles Membro Participativo

    Segui o help sim do progress, porém, não faz sentido o erro que o mesmo esta me apresentando: "Erro de parsing de JSON: esperado brace, mas localizado {. (15358)".

    Segui fielmente o que o help do progress faz, o source-type que estou usando é long-char. Por acaso teriam alguma sugestão melhor?
  6. Cobra.cne

    Cobra.cne Equipe de Suporte Moderador

    Olá Erick,

    Não tenho muita experiência com com JSON, e pelo que pude avaliar, a importação automática igual você esta fazendo não vai funcionar sem que você faça alguns ajustes.

    Primeiro o JSON que você tem são duas tabelas, a primeira que estou chamando de "ttretorno" e precisa ser tratada manualmente, e a outra "filha" chamada "results", então seria necessário importar em um DataSet. Partindo da sua variável de retorno que gravei em um arquivo para não precisar tratar todos os caracteres, montei o código abaixo que vai auxiliar você na solução definitiva.

    PHP:
    DEFINE VARIABLE cSourceType AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cReadMode   AS CHARACTER NO-UNDO INITIAL "EMPTY".
    DEFINE VARIABLE cFile       AS CHARACTER NO-UNDO.
    DEFINE VARIABLE lRetOK      AS LOGICAL   NO-UNDO.
    DEFINE VARIABLE hDSet       AS HANDLE    NO-UNDO.
    DEFINE VARIABLE httRetorno  AS HANDLE      NO-UNDO.
    DEFINE VARIABLE hresults    AS HANDLE      NO-UNDO.

    DEFINE VARIABLE strRET      AS LONGCHAR NO-UNDO.

    DEFINE TEMP-TABLE ttRetorno NO-UNDO
        FIELD multicast_id 
    AS INT64
        FIELD success      
    AS INTEGER
        FIELD failure      
    AS INTEGER
        FIELD canonical_ids 
    AS INTEGER.

    DEFINE TEMP-TABLE results NO-UNDO
        FIELD message_id 
    AS CHARACTER.

    ASSIGN cSourceType = "LONGCHAR" 
           
    cReadMode   = "empty".


    /* Carregando retorno de exemplo */
    COPY-LOB FROM FILE "C:\TEMP\dset.json" TO strRet.

    ASSIGN strRet = '~{"ProDataSet":~{"ttretorno":~[' + strRet + "~]~}~}".


    ASSIGN httRetorno = BUFFER ttRetorno:HANDLE
           hResults   
    = BUFFER results:HANDLE.

    CREATE DATASET hDSet.
    hDset:SET-BUFFERS(httRetorno,hRESULTs).
    hDSet:ADD-RELATION(httRetorno,hResults,"multicast_id,multicast_id",FALSE,TRUE) NO-ERROR.

    lRetOK = hDSet:READ-JSON(cSourceType,
                             
    strRet,
                             
    cReadMode).
    MESSAGE "lRetOK" lRetOK
        VIEW
    -AS ALERT-BOX INFO BUTTONS OK.

    FOR 
    EACH ttRetorno:
        
    DISP ttRetorno.
    END.
    FOR 
    EACH results:
        
    DISP results.
    END.
    Espero que ajude.
    fgodoi e rlfritz curtiram isso.

Compartilhe esta Página