Olá alguém ja conseguiu enviar bytes para uma api, passando o pdf inteiro?
Boa tarde,
Da uma olhadinha eu envio um pdf via mulformdata. deve te ajudar.
Boa tarde, Muito obrigado pela ajuda
Eu tenho que fazer uma integração com api de assinatura online, eles passam a api e a requisição via postman para teste : Intellisign Suite | Integrando com o Intellisign .
Porém no fluig, eu consegui chegar até a criação do envelope para envio, retornei o binario, mas não consegui realizar o envio, function createDataset(fields, constraints, sortFields) {
var dataset = DatasetBuilder.newDataset();
dataset.addColumn(“status”);
dataset.addColumn(“message”);
dataset.addColumn(“response”);
try {
log.info("=== INÍCIO DO DATASET ds_UploadDocumento ===");
var envelopeId = findConstraint("envelopeId", constraints);
var documentId = findConstraint("documentId", constraints);
var accessToken = findConstraint("token", constraints);
var organizationId = findConstraint("organizationId", constraints);
var fileName = findConstraint("fileName", constraints) || "documento.pdf";
log.dir("envelopeId:" + envelopeId)
log.dir("documentId:" + documentId)
log.dir("accessToken:" + accessToken)
log.dir("organizationId:" + organizationId)
log.dir("fileName:" + fileName)
if (!envelopeId || !documentId || !accessToken || !organizationId) {
dataset.addRow(["ERROR", "Parâmetros obrigatórios não informados.", ""]);
return dataset;
}
var csDocumento = DatasetFactory.createConstraint("nomeArquivo", "Proposta-Analista.pdf", "Proposta-Analista.pdf", ConstraintType.MUST);
var csDocId = DatasetFactory.createConstraint("documentId", "1481", "1481", ConstraintType.MUST);
var csVersao = DatasetFactory.createConstraint("documentoVersao", "1000", "1000", ConstraintType.MUST);
var csUsuario = DatasetFactory.createConstraint("colleagueId", "fluig", "fluig", ConstraintType.MUST);
var fileBytes = DatasetFactory.getDataset("ds_FileByte", null, new Array(csDocumento, csDocId, csVersao, csUsuario), null);
log.dir("fileBytes:")
log.dir("=== fileBytes ===");
log.dir(fileBytes);
if (fileBytes != null && fileBytes.rowsCount > 0) {
var bytes = fileBytes.getValue(0, "byte");
log.info("=== Bytes retornados ===");
log.info(bytes);
} else {
log.warn("Nenhum dado retornado do dataset ds_FileByte");
}
var bytes = fileBytes.getValue(0, "byte");
// var boundary = "----FluigFormBoundary" + new Date().getTime();
// var formData =
// "--" + boundary + "\r\n" +
// "Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n" +
// "Content-Type: application/pdf\r\n\r\n" +
// bytes + "\r\n" +
// "--" + boundary + "--"
var clientService = fluigAPI.getAuthorizeClientService();
var data = {
companyId: getValue("WKCompany") + "",
serviceCode: "testeOAuth",
endpoint: "/v1/envelopes/" + envelopeId + "/documents",
method: "post",
timeoutService: "1000",
headers: {
"X-Organization": organizationId,
"Content-Type": "application/json",
"Accept": "application/json"
},
params: {
"file": bytes
}
};
log.info("=== Enviando upload binário multipart ===");
log.dir("=== REQUEST MONTADO ===");
log.dir(data);
var result = clientService.invoke(JSON.stringify(data));
if (!result || result.getResult() == null) {
dataset.addRow(["ERROR", "Nenhum retorno do serviço.", ""]);
return dataset;
}
var httpStatus = result.getHttpStatusResult();
var response = result.getResult();
dataset.addRow([httpStatus, "Upload realizado", response]);
// var clientIntellisign = fluigAPI.getAuthorizeClientService();
// var requestIntellisign = clientIntellisign.invoke({
// companyId: getValue("WKCompany"),
// serviceCode: "OAuthTokenService",
// endpoint: "/v1/envelopes/" + envelopeId + "/documents",
// method: "POST",
// timeoutService: "60000",
// headers: {
// "Authorization": "Bearer " + accessToken,
// "X-Organization": organizationId,
// "Accept": "application/json"
// },
// params: [
// {
// name: "file",
// fileName: fileName,
// contentType: "application/pdf",
// content: bytes
// }
// ]
// });
// var httpCode = requestIntellisign.getHttpStatusResult();
// var resultStr = requestIntellisign.getResult();
//
// log.info("HTTP Status: " + httpCode);
// log.info("Retorno Intellisign: " + resultStr);
//
// if (httpCode != 200 && httpCode != 201) {
// dataset.addRow(["ERROR", "Falha no upload binário: HTTP " + httpCode, resultStr]);
// return dataset;
// }
//
// var response = JSON.parse(resultStr);
// dataset.addRow(["SUCCESS", "Upload binário realizado com sucesso!", JSON.stringify(response)]);
// log.info("=== FIM ds_UploadDocumento ===");
} catch (e) {
dataset.addRow(["ERROR", e.message, e.stack]);
log.error("Erro no ds_UploadDocumento: " + e);
}
return dataset;
}
function findConstraint(fieldName, constraints) {
if (constraints != null) {
for (var i = 0; i < constraints.length; i++) {
if (constraints[i].fieldName == fieldName) {
return constraints[i].initialValue;
}
}
}
return null;
}
//function createDataset(fields, constraints, sortFields) {
// var dataset = DatasetBuilder.newDataset();
// dataset.addColumn(“status”);
// dataset.addColumn(“message”);
// dataset.addColumn(“response”);
//
// try {
// log.info(“=== INÍCIO DO DATASET ds_UploadDocumento ===”);
// var envelopeId = findConstraint(“envelopeId”, constraints);
// var documentId = findConstraint(“documentId”, constraints);
// var accessToken = findConstraint(“token”, constraints);
// var organizationId = findConstraint(“organizationId”, constraints);
// var fileName = findConstraint(“fileName”, constraints) || “documento.pdf”;
// log.dir(“envelopeId:”+envelopeId)
// log.dir(“documentId:”+documentId)
// log.dir(“accessToken:”+accessToken)
// log.dir(“organizationId:”+organizationId)
// log.dir(“fileName:”+fileName)
//
// if (!envelopeId || !documentId || !accessToken || !organizationId) {
// dataset.addRow([“ERROR”, “Parâmetros obrigatórios não informados.”, “”]);
// return dataset;
// }
//
// var csDocumento = DatasetFactory.createConstraint(“nomeArquivo”, “Proposta-Analista.pdf”, “Proposta-Analista.pdf”, ConstraintType.MUST);
// var csDocId = DatasetFactory.createConstraint(“documentId”, “1481”, “1481”, ConstraintType.MUST);
// var csVersao = DatasetFactory.createConstraint(“documentoVersao”, “1000”, “1000”, ConstraintType.MUST);
// var csUsuario = DatasetFactory.createConstraint(“colleagueId”, “fluig”, “fluig”, ConstraintType.MUST);
// var fileBytes = DatasetFactory.getDataset(“ds_FileByte”, null, new Array(csDocumento, csDocId, csVersao, csUsuario), null);
// log.dir(“fileBytes:”)
//
// log.dir(“=== fileBytes ===”);
//log.dir(fileBytes); // Mostra toda a estrutura retornada
//
//if (fileBytes != null && fileBytes.rowsCount > 0) {
// var bytes = fileBytes.getValue(0, “byte”); // forma segura de acessar o campo
// log.info(“=== Bytes retornados ===”);
// log.info(bytes); // log.info para strings simples
//} else {
// log.warn(“Nenhum dado retornado do dataset ds_FileByte”);
//}
//
//
// var clientIntellisign = fluigAPI.getAuthorizeClientService();
// var requestIntellisign = clientIntellisign.invoke({
// companyId: getValue(“WKCompany”),
// serviceCode: “OAuthTokenService”,
// endpoint: “/v1/envelopes/” + envelopeId + “/documents”,
// method: “POST”,
// timeoutService: “60000”,
// headers: {
// “Authorization”: "Bearer " + accessToken,
// “X-Organization”: organizationId,
// “Accept”: “application/json”
// },
// params: [
// {
// name: “file”,
// fileName: fileName,
// contentType: “application/pdf”,
// content: bytes
// }
// ]
// });
//
// var httpCode = requestIntellisign.getHttpStatusResult();
// var resultStr = requestIntellisign.getResult();
//
// log.info("HTTP Status: " + httpCode);
// log.info(“Retorno Intellisign: " + resultStr);
//
// if (httpCode != 200 && httpCode != 201) {
// dataset.addRow([“ERROR”, “Falha no upload binário: HTTP " + httpCode, resultStr]);
// return dataset;
// }
//
// var response = JSON.parse(resultStr);
// dataset.addRow([“SUCCESS”, “Upload binário realizado com sucesso!”, JSON.stringify(response)]);
// log.info(”=== FIM ds_UploadDocumento ===”);
//
// } catch (e) {
// dataset.addRow([“ERROR”, e.message, e.stack]);
// log.error("Erro no ds_UploadDocumento: " + e);
// }
//
// return dataset;
//}
//
//function findConstraint(fieldName, constraints) {
// if (constraints != null) {
// for (var i = 0; i < constraints.length; i++) {
// if (constraints[i].fieldName == fieldName) {
// return constraints[i].initialValue;
// }
// }
// }
// return null;
//}-
Tá bem complicado entender o código devido à formatação.
Segue essa orientação pro código ficar visualmente aceitável ou coloca num gist
Caso você tenha o arquivo no GED do Fluig pode fazer uma chamada assim.
function createDataset(fields, constraints, sortFields) {
var dataset = DatasetBuilder.newDataset();
dataset.addColumn("status");
dataset.addColumn("message");
dataset.addColumn("response");
log.info("=== INÍCIO DO DATASET ds_UploadDocumento ===");
try {
// =========================================================
// 1️⃣ LEITURA DOS PARÂMETROS
// =========================================================
var envelopeId = findConstraint("envelopeId", constraints);
var documentId = findConstraint("documentId", constraints);
var documentVersion = findConstraint("documentVersion", constraints);
var accessToken = findConstraint("token", constraints);
var organizationId = findConstraint("organizationId", constraints);
var fileName = findConstraint("fileName", constraints) || "documento.pdf";
log.info("[ds_UploadDocumento] --- PARÂMETROS ---");
log.info("envelopeId: " + envelopeId);
log.info("documentId: " + documentId);
log.info("documentVersion: " + documentVersion);
log.info("organizationId: " + organizationId);
log.info("fileName: " + fileName);
log.info("-----------------------------------------");
if (!envelopeId || !documentId || !accessToken || !organizationId) {
dataset.addRow(["ERROR", "Parâmetros obrigatórios não informados (envelopeId, documentId, token, organizationId).", ""]);
return dataset;
}
// =========================================================
// 2️⃣ BUSCA DOS BYTES DO DOCUMENTO (via ds_FileByte)
// =========================================================
var csNome = DatasetFactory.createConstraint("nomeArquivo", fileName, fileName, ConstraintType.MUST);
var csDocId = DatasetFactory.createConstraint("documentId", documentId, documentId, ConstraintType.MUST);
var csVersao = DatasetFactory.createConstraint("documentoVersao", documentVersion, documentVersion, ConstraintType.MUST);
var csUsuario = DatasetFactory.createConstraint("colleagueId", "fluig", "fluig", ConstraintType.MUST);
var dsFile = DatasetFactory.getDataset("ds_FileByte", null, [csNome, csDocId, csVersao, csUsuario], null);
log.info("[ds_UploadDocumento] Dataset ds_FileByte executado.");
if (dsFile == null || dsFile.rowsCount == 0) {
throw "Nenhum conteúdo retornado pelo dataset ds_FileByte.";
}
var bytes = dsFile.getValue(0, "byte");
log.info("[ds_UploadDocumento] Bytes obtidos com sucesso. Tamanho: " + (bytes ? bytes.length : 0));
// =========================================================
// 3️⃣ MONTA REQUISIÇÃO PARA UPLOAD BINÁRIO
// =========================================================
var clientService = fluigAPI.getAuthorizeClientService();
var requestData = {
companyId: getValue("WKCompany"),
serviceCode: "testeOAuth", // nome do serviço OAuth cadastrado no Fluig
endpoint: "/v1/envelopes/" + envelopeId + "/documents",
method: "POST",
timeoutService: "60000",
headers: {
"Authorization": "Bearer " + accessToken,
"X-Organization": organizationId,
"Accept": "application/json"
},
params: [
{
name: "file",
fileName: fileName,
contentType: "application/pdf",
content: bytes
}
]
};
log.info("[ds_UploadDocumento] --- REQUEST MONTADO ---");
log.dir(requestData);
// =========================================================
// 4️⃣ EXECUTA REQUISIÇÃO VIA CLIENT SERVICE
// =========================================================
var result = clientService.invoke(JSON.stringify(requestData));
if (result == null || result.getResult() == null) {
log.error("[ds_UploadDocumento] Nenhum retorno do clientService.invoke().");
dataset.addRow(["ERROR", "Nenhum retorno do serviço.", ""]);
return dataset;
}
var httpStatus = result.getHttpStatusResult();
var response = result.getResult();
log.info("[ds_UploadDocumento] --- RESULTADO ---");
log.info("HTTP Status: " + httpStatus);
log.info("Resposta: " + response);
log.info("-----------------------------------------");
// =========================================================
// 5️⃣ TRATAMENTO DO RETORNO
// =========================================================
if (httpStatus == 200 || httpStatus == 201) {
dataset.addRow(["SUCCESS", "Upload binário realizado com sucesso!", response]);
} else {
dataset.addRow(["ERROR", "Falha no upload. HTTP " + httpStatus, response]);
}
} catch (e) {
log.error("[ds_UploadDocumento] Erro capturado: " + e);
dataset.addRow(["ERROR", e.message || e.toString(), e.stack || ""]);
}
log.info("=== FIM DO DATASET ds_UploadDocumento ===");
return dataset;
}
// =========================================================
// 🔎 Função auxiliar para pegar constraint
// =========================================================
function findConstraint(fieldName, constraints) {
if (constraints != null) {
for (var i = 0; i < constraints.length; i++) {
if (constraints[i].fieldName == fieldName) {
return constraints[i].initialValue;
}
}
}
return null;
}
function servicetask114(attempt, message) {
log.info("=== servicetask114: Iniciada ===");
try {
gerarFluxoCompletoAssinatura();
} catch (e) {
log.error("Erro ao executar servicetask114: " + e);
throw e;
}
}
function gerarFluxoCompletoAssinatura() {
log.info("=== INÍCIO FLUXO COMPLETO ASSINATURA ===");
// === TOKEN ===
var dsToken = DatasetFactory.getDataset("ds_GerarToken", null, null, null);
if (!dsToken || dsToken.rowsCount === 0) throw "ds_GerarToken não retornou resultado.";
var token = dsToken.getValue(0, "access_token") || dsToken.getValue(0, "token");
if (!token || token.trim() === "") throw "Token não retornado corretamente.";
hAPI.setCardValue("token", token);
log.info("Token gerado com sucesso.");
// === ORGANIZAÇÃO ===
var cToken = DatasetFactory.createConstraint("token", token, token, ConstraintType.MUST);
var dsOrg = DatasetFactory.getDataset("ds_ListarOrganizacao", null, [cToken], null);
if (!dsOrg || dsOrg.rowsCount === 0) throw "ds_ListarOrganizacao não retornou resultado.";
var organizationId = dsOrg.getValue(0, "organizationId") || dsOrg.getValue(0, "id");
if (!organizationId) throw "Organization ID não retornado.";
hAPI.setCardValue("organizationId", organizationId);
log.info("Organização identificada: " + organizationId);
// === ENVELOPE ===
var dsEnvelope = DatasetFactory.getDataset("ds_CriarEnvelope", null, [cToken], null);
if (!dsEnvelope || dsEnvelope.rowsCount === 0) throw "ds_CriarEnvelope não retornou resultado.";
var envelopeId = dsEnvelope.getValue(0, "id");
if (!envelopeId) throw "Envelope ID não retornado.";
hAPI.setCardValue("envelopeId", envelopeId);
log.info("Envelope criado: " + envelopeId);
// === DOCUMENTO ===
var anexos = hAPI.listAttachments();
if (anexos.size() === 0) throw "Nenhum anexo encontrado no formulário.";
var arquivo = anexos.get(0);
var documentId = arquivo.getDocumentId();
var documentVersion = arquivo.getVersion();
var fileName = arquivo.getDocumentDescription();
log.info("Documento selecionado: " + fileName + " (ID: " + documentId + " v" + documentVersion + ")");
var cEnvelope = DatasetFactory.createConstraint("envelopeId", envelopeId, envelopeId, ConstraintType.MUST);
var cDocumentId = DatasetFactory.createConstraint("documentId", documentId, documentId, ConstraintType.MUST);
var cDocumentVersion = DatasetFactory.createConstraint("documentVersion", documentVersion, documentVersion, ConstraintType.MUST);
var cFileName = DatasetFactory.createConstraint("fileName", fileName, fileName, ConstraintType.MUST);
var cOrg = DatasetFactory.createConstraint("organizationId", organizationId, organizationId, ConstraintType.MUST);
var dsUpload = DatasetFactory.getDataset("ds_UploadDocumento", null, [cToken, cEnvelope, cDocumentId, cDocumentVersion, cFileName, cOrg], null);
if (!dsUpload || dsUpload.rowsCount === 0) throw "ds_UploadDocumento não retornou resultado.";
var statusUpload = dsUpload.getValue(0, "status");
var msgUpload = dsUpload.getValue(0, "message");
if (statusUpload !== "SUCCESS")
throw "Erro ao enviar documento: " + msgUpload;
log.info("Documento anexado ao envelope com sucesso.");
// === DESTINATÁRIO ===
var email = (hAPI.getCardValue("txtEmail") || "").trim();
var nome = (hAPI.getCardValue("txtNome") || "").trim();
if (email === "") throw "Campo 'txtEmail' está vazio no formulário.";
if (nome === "") throw "Campo 'txtNome' está vazio no formulário.";
var cEmail = DatasetFactory.createConstraint("txtEmail", email, email, ConstraintType.MUST);
var cNome = DatasetFactory.createConstraint("txtNome", nome, nome, ConstraintType.MUST);
var dsDest = DatasetFactory.getDataset("ds_CriarDestinatario", null, [cToken, cEnvelope, cEmail, cNome], null);
if (!dsDest || dsDest.rowsCount === 0) throw "ds_CriarDestinatario não retornou resultado.";
log.info("Destinatário criado: " + nome + " (" + email + ")");
// === ENVIAR ENVELOPE ===
var dsEnviar = DatasetFactory.getDataset("ds_EnviarEnvelope", null, [cToken, cEnvelope], null);
if (!dsEnviar || dsEnviar.rowsCount === 0) throw "ds_EnviarEnvelope não retornou resultado.";
log.info("Envelope enviado para assinatura.");
log.info("Fluxo finalizado com sucesso.");
}
@Gustavo_Soares , assim como comentei naquele post indicado, os métodos padrões do Fluig não trabalham com multipart/form-data. Nessa situação temos que enviar manualmente a requisição.
Segue um exemplo de como faço:
/**
* Efetua a requisição POST ao Gescon enviando o arquivo
*
* @param {string} codigoContrato
* @param {number} idComprometimento
* @param {number} tipoArquivo
* @param {string} descritivo
* @param {com.fluig.sdk.api.document.DocumentVO} arquivo
* @returns {boolean}
* @throws {string}
*/
function sendAttachmentToGescon(codigoContrato, idComprometimento, tipoArquivo, descritivo, arquivo) {
// eu passo pra essa função o arquivo
// var arquivo = fluigAPI.getDocumentService().getActive(parseInt(idArquivo));
// Nessa função eu chamo um dataset com as configurações do serviço
var gesconConfig = getGesconRestConfig();
var pathSeparator = java.io.File.separator;
// Pego o path do arquivo pra carregar na requisição
var filePath = fluigAPI.getTenantService().getTenantData(["dirDefault"]).get("dirDefault")
+ pathSeparator
+ "public"
+ pathSeparator
+ arquivo.getDocumentId()
+ pathSeparator
+ arquivo.getVersion()
+ pathSeparator
+ arquivo.getPhisicalFile()
;
var entityBuilder = org.apache.http.entity.mime.MultipartEntityBuilder.create();
entityBuilder.setMode(org.apache.http.entity.mime.HttpMultipartMode.BROWSER_COMPATIBLE);
// Aqui são os campos "comuns"
entityBuilder.addTextBody("idComprometimento", idComprometimento);
entityBuilder.addTextBody("tipoId", tipoArquivo);
// Esse campo tem acentuação no conteúdo, então coloco o tipo do conteúdo com utf-8
entityBuilder.addTextBody("descritivo", descritivo, org.apache.http.entity.ContentType.create("text/plain", "UTF-8"));
// Esse é o campo com o binário do arquivo
entityBuilder.addBinaryBody(
"arquivo",
new java.io.File(filePath),
org.apache.http.entity.ContentType.DEFAULT_BINARY,
arquivo.getPhisicalFile()
);
var httpPost = new org.apache.http.client.methods.HttpPost(
gesconConfig.domain
+ "/contratos/"
+ codigoContrato
+ "/comprometimentos/"
+ idComprometimento
+ "/anexos"
);
httpPost.setHeader("Authorization", gesconConfig.token);
httpPost.setEntity(entityBuilder.build());
var httpClient = org.apache.http.impl.client.HttpClients.createDefault();
// Esse serviço retornou um JSON, então converti a resposta
var response = JSON.parse( org.apache.http.util.EntityUtils.toString(httpClient.execute(httpPost).getEntity()));
httpClient.close();
return response.success == true && response.data == "OK";
}