Я интегрирую сервис в свое приложение, которое использует SOAP Api. Мое приложение на Node.js. В документации сервиса сказано, что для загрузки файла я должен использовать fileData
типа Byte[]
(байты фрагмента файла). Я пробовал разные подходы, но ни один из них не работал. Я даже пытался использовать Uint8Array (найдите здесь на SO некоторые ответы), но это тоже не сработало. Вот как выглядит мой запрос:
const url = `https://memoq.pangea.global:8080/memoQServices/FileManager/FileManagerService`;
async function addFilesToMemoq() {
try {
const fileData = fs.readFileSync('./dist/reqfiles/xtm/dev-req.doc', 'base64');
const headers = {
'Content-Type': 'text/xml;charset=UTF-8',
'soapAction': 'http://kilgray.com/memoqservices/2007/IFileManagerService/AddNextFileChunk',
};
for(let chunk of new Uint8Array(fileData)) {
const xml = `${xmlHeader}
<soapenv:Body>
<ns:AddNextFileChunk>
<ns:fileIdAndSessionId>d00121ab-78ca-4dcf-80b7-9b3d9e4fb905</ns:fileIdAndSessionId>
<ns:fileData>${chunk}</ns:fileData>
</ns:AddNextFileChunk>
</soapenv:Body>
</soapenv:Envelope>`
const { response } = await soapRequest({url, headers, xml});
//Result is just for breakpoints if needed to debug
const result = parser.toJson(response.body, {object: true, sanitize: true, trim: true});
}
return await finishMemoqFileMove();
// return result;
} catch(err) {
return parser.toJson(err, {object: true, sanitize: true, trim: true});
}
}
async function finishMemoqFileMove() {
const xml = `${xmlHeader}
<soapenv:Body>
<ns:EndChunkedFileUpload>
<ns:fileIdAndSessionId>d00121ab-78ca-4dcf-80b7-9b3d9e4fb905</ns:fileIdAndSessionId>
</ns:EndChunkedFileUpload>
</soapenv:Body>
</soapenv:Envelope>`
const headers = {
'Content-Type': 'text/xml;charset=UTF-8',
'soapAction': 'http://kilgray.com/memoqservices/2007/IFileManagerService/EndChunkedFileUpload',
};
try {
const { response } = await soapRequest({url, headers, xml});
const result = parser.toJson(response.body, {object: true, sanitize: true, trim: true});
return result;
} catch(err) {
return parser.toJson(err, {object: true, sanitize: true, trim: true});
}
}
Но этот запрос отправляет в сервис пустой файл. new Uint8Array(fileData)
становится массивом 0
с. Если я не использую Uint8Array
, тогда я получу сообщение об ошибке: Base64 sequence length(3) not valid. Must be a multiple of 4.
Если я использую base64
, опция в readFileSync
- fileData
становится большой строкой символов, если я удаляю это, тогда fileData
становится массивом (буфером) с номерами в качестве элементов. Для запросов soap я использую пакет узла easy-soap-request
. Буду признателен, если кто-нибудь сможет помочь с этим.
Если это поможет, вот документы службы Я пытаюсь следовать.