如何使用node-soap库向soap请求添加文件附件?

时间:2018-02-02 09:58:41

标签: node.js soap-client node-soap

我需要从node.js应用程序向soap请求添加文件附件。

我能够使用node-soap库发送请求,现在我需要在请求中添加一个文件。

我用java客户端或soapUI做过,但是我必须在node.js中做,也许可以覆盖默认请求对象?

2 个答案:

答案 0 :(得分:5)

我没有找到使用node-soap的解决方案,我必须手动构建我的肥皂请求:

var soapHeader = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header/><soapenv:Body><ws:method>';
var soapFooter = '</ws:method></soapenv:Body></soapenv:Envelope>';

function sendSoapRequestWithAttachments(soap,files){
   var soapRequest = jsonToXml.buildObject(mail);
   var finalSoapRequest = soapHeader + soapRequest + soapFooter;
   var multipartMail = [];

    // Add soap request
    multipartMail.push({
        'Content-Type': 'text/xml; charset=utf-8',
        body: finalSoapRequest
    });
    // Add attachments
    if (files) {
        files.forEach(function (file) {
            multipartMail.push({
                'Content-Id': '<' + file.uuid + '>',
                'Content-Type': 'application/octet-stream',
                'Content-Transfer-Encoding': 'binary',
                body: fs.createReadStream(file.path)
            });
        });
    }
    var options = {
        uri: URL,
        method: 'POST',
        multipart: multipartMail
    };
    request.post(options, function (error, response) {
        ...
    }
}

答案 1 :(得分:1)

我找到了一种使用base-soap编码使用node-soap发送附件的方法 这是一个例子

import soap from 'soap'
import fs from 'fs'

async function main(){
  const filepath = '/path/to/attachment/file.extension'
  const client = await soap.createClientAsync(/* ... */)
  const result = await client.AnApiMethodAsync({
    expectedKeyForTheFile: await fs.readFileAsync(filepath, 'base64')
  })
}

main()