Parâmetros em requisição POST para API REST

Bom dia, pessoal.

Em um evento de formulário eu crio um JSON dinâmico extraindo dados de uma tabela pai x filho para que no final do processo eu realize a integração com um serviço REST previamente cadastrado no Fluig.

Preciso passar esse JSON para a requisição abaixo na área "params", alguém tem alguma ideia de como realizar essa operação?

Pensei em duas soluções e não obtive sucesso:

  • Passar o JSON via constraint e popular a área params: não consegui preencher a área com os valores corretos.

    • Fazer a gambiarra de popular um campo com o JSON e depois recuperar o conteúdo via hAPI ou algo do tipo: no evento inputFields populei um campo oculto e tentei chamar como SC: hAPI.getCardValue("json") no evento beforeTaskComplete.

function createDataset(fields, constraints, sortFields) {

    var dataset = DatasetBuilder.newDataset();
    dataset.addColumn("return");

    var clientService = fluigAPI.getAuthorizeClientService(); 

    var data = {
        companyId: getValue("WKCompany") + '', 
        serviceCode: 'api_solicitacaocompra',
        endpoint: '/rest/SC',
        method: 'post',
        timeoutService: '1000',
        params:{

            "SC":{
                "NUM": "cDoc",
                "SOLICITANTE": "cUserName",
                "EMISSAO": "dDataBase",
                "ITENS":
              [{
                  "ITEM":"0001",
                  "PRODUTO":"43214",
                  "QUANTIDADE":1,
                  "DATA":"",
                  "LOCAL":"01",
                  "CC":"210801",
                  "DESCRI":"DESCRICAO DO PRODUTO",
                  "UM":"UN",
                  "OBS":"GERADO VIA WEBSERVICE"
            }]
            }
        }
    };

    var vo = clientService.invoke(JSON.stringify(data));
    if(vo.getResult() == null || vo.getResult().isEmpty()){
        dataset.addRow(new Array("Sem retorno"));
    } else{
        dataset.addRow(new Array(vo.getResult()));
    }

    return dataset; 
}

Valeu galera!

Boa tarde Rafael,

como a idéia é executar a integração no final da solicitação, a sugestão é utilizar um evento de processo como o afterProcessFinish ou uma atividade de serviço que são as formas recomendadas para fazer uma efetivação (datasets são indicados para consultas).

Segue um exemplo de utilização via afterProcessFinish, onde você pode utilizar a hAPI para pegar os dados da tabela pai x filho, percorrer esses valores e ir adicionando no seu array de itens:


function afterProcessFinish(processId){

    log.warn(">>>>>>>>>>>>>>>>>");

    var cardData = hAPI.getCardData(processId);

    var cDoc = "cDoc";
    var cUserName = "cUserName";
    var dDataBase = "cDataBase";

    var items = [];

    // pegando os valores dos campos de cada linha do formulario pai x filho
    var fieldKeys = cardData.keySet().toArray();
    for (var i = 0; i < fieldKeys.length; i++) {
        if (fieldKeys[i].startsWith("Produto___")) {
            var index = parseInt(fieldKeys[i].replace("Produto___", ""));
            var item = { 
                "ITEM": "0001",
                "PRODUTO": String(cardData.get("Produto___" + index)),
                "QUANTIDADE": parseInt(cardData.get("estoque___" + index)),
                "DATA": "",
                "LOCAL": "01",
                "CC": "210801",
                "DESCRI": String(cardData.get("Produto___" + index)),
                "UM": String(cardData.get("tipo___" + index)),
                "OBS": "GERADO VIA WEBSERVICE"
            }
            items.push(item);
        }
    }

    var clientService = fluigAPI.getAuthorizeClientService(); 

    var data = {
        companyId: getValue("WKCompany") + '', 
        serviceCode: 'api_solicitacaocompra',
        endpoint: '/rest/SC',
        method: 'post',
        timeoutService: '1000',
        params:{
            "SC":{
                "NUM": cDoc,
                "SOLICITANTE": cUserName,
                "EMISSAO": dDataBase,
                "ITENS": items
            }
        }
    };

    clientService.invoke(JSON.stringify(data));

}

Opa, valeu Diogo! Fui realizar a implementação aqui com um processo de teste e aparentemente com esse evento o processo está se perdendo na hora de finalizar. Segue a mensagem: “Não foi possível encontrar a atividade 1 do processo sc_processo2”. Isso pode ter alguma relação com o parâmetro processId? O pior é que sem esse evento o processo roda normalmente.
Em outro evento tipo afterTaskComplete eu não consigo usar getChildrenIndexes, vou tentar realizar de outra forma.

Você poderia postar no código do seu afterProcessFinish de teste?

Diogo, segue: error.log · GitHub

Não consegui publicar aqui pela quantidade de caracteres.

O processo de teste é bem simples também, só possui os passos início, atividade1 e fim. Não consegui entender a raiz dos erros.

Rafael, desculpe, coloquei a carroça na frente dos bois. Esse recurso de getChildrenIndexes na hAPI só vai estar disponível na próxima versão do fluig, então alterei o código de exemplo da minha resposta passando a utilizar o hAPI.getCardData

Boa Diogo! Funcionou perfeitamente.