Chamar serviço REST em evento de Processo

E ai pessoal, seguinte: cadastrei um serviço REST no painel de controle e testei o mesmo com sucesso.

Porém, não consigo fazer a chamada corretamente no evento de processo. Na documentação https://tdn.totvs.com/pages/releaseview.action?pageId=239041233 há alguns exemplos de chamada no qual em determinado trecho do código apresenta a linha de comando: var vo = clientService.invoke(JSON.stringify(data));

Porém se eu executar isso dá um erro no log do servidor informando que o comando toJSON não é valido. Utilizei então o comando JSONUtil.toJSON( data ), mas acredito que este transforma para objeto JSON e o comando do tutorial transforma o JSON para Stringify.

Com este comando também não funciona: var vo = clientService.invoke(JSONUtil.toJSONString( data ));

Alguém sabe como posso resolver este problema e conseguir fazer a chamada ao serviço REST cadastrado?

Olá,

Creio que desta forma funcione, eu utilizo algo semelhante a isso.


var docid = '1234',
try{

  var tenantId     = '01';     
  var clientService   = fluigAPI.getAuthorizeClientService();
  var data = {                                                   
    companyId       : getValue("WKCompany")+'', //codigo da empresa
    serviceCode     : 'FILE_URL_SERVICE', //Codigo do seu serviço cadastrado
    endpoint        : 'api/public/ecm/document/downloadURL/'+docid, //endpoint da api desejada (URI)
    method          : 'get',
    timeoutService  : '100',
      }                

  var vo = clientService.invoke(JSON.stringify(data));
       if(vo.getResult()== null || vo.getResult().isEmpty()){
                    log.info("Sem registros");
       }else{
                    log.info("Resposta:"+vo.getResult());
       }
} catch(e){
  log.info("Erro ao se comunicar com o serviço: "+e.message);
}

Olá Francis, Eu utilizei também desta forma que mencionaste, porém apresenta o erro na linha: var vo = clientService.invoke(JSON.stringify(data)); Este é o erro apresentado no log: ERRO AO EXECUTAR SCRIPT -> NOK - Java class "[Ljava.lang.reflect.Constructor;" has no public instance field or method named "toJSON".

Já tentei utilizar o comando: var vo = clientService.invoke(JSONUtil.toJSONString( data )); Mas também não funciona.

Tenta JSONUtil.toJSON(data)

Francis, estou tentando fazer a requisição igual ao código que você mencionou acima.
Como você cadastrou o serviço no Fluig? Acredito que meu erro foi nisso.

Seguinte, primeiro você deve criar um Provider para esta API, e em seguida criar um OAuth Application que consome esse Provider, este link pode te ajudar a fazer esta configuração: Fluig API - TOTVS Fluig - TDN

Depois disso criei o serviço no menu de serviços do fluig, e adicionei a URL da API, e informei o metodo de autenticação OAuth passando o token/ secret gerados no meu OAuth Application.

Dado o erro

Java class "[Ljava.lang.reflect.Constructor;"

Eu sugiro você se certificar se o JSON montado está correto. Nos campos strings eu uso geralmente o data assim:


var data = {
   "campo1": variavel1 +"",
   "campo2": variavel2 +"",
}

Várias vezes só funcionou depois que eu usava aspas duplas e adicionava o +""

No meu caso só consegui resolver concatenando os parâmetros como uma string de texto, ficando dessa forma:


var parametros = "?IDENT=&DESC="+titulo+"&CODSOL="+loginSolicitante+"&SOLIC="+nomeSolicitanteUTF";

var clientService   = fluigAPI.getAuthorizeClientService();
var data = {                                                   
    companyId       : getValue("WKCompany")+"", //codigo da empresa
    serviceCode     : 'PROTHEUS_REST', //Codigo do seu serviço cadastrado
    endpoint        : "/rest/CADASTROCM"+parametros+"", //endpoint da api desejada (URI)
    method          : 'get',
    timeoutService  : '10000',
      options : {
         "encoding" : "UTF-8",
         "mediaType": "application/json"
      },
     headers: {
         "Content-Type": "application/json;charset=UTF-8"
     }
}

var vo = clientService.invoke(JSON.stringify(data));
if(vo.getResult()== null || vo.getResult().isEmpty()){
    //o que fazer em caso de erro
}else{
    log.info("Resposta:"+vo.getResult());
    var retorno  = JSON.parse(vo.getResult());
}

Porém, tive que fazer uma alteração também na string de texto enviada pois se houver um espaço em branco ele quebra o JSON enviado, ou seja, mesmo colocando que o encoding era UTF8 ele não está respeitando.

Para solucionar este problema usei a função encodeURIComponent(variável);

exemplo:


var titulo = hAPI.getCardValue("titulo"); //título com espaços em branco
var tituloMudancaUTF = encodeURIComponent(tituloMudanca); //titulo que encoda caracteres como espaço em branco