How to consume MTOM SOAP web service in node.js?

前端 未结 2 739
梦如初夏
梦如初夏 2021-01-14 08:14

I need to download or process a file from a soap based web service in node.js. can someone suggest me on how to handle this in node.js

I tried with \'node-soap\' or

2条回答
  •  礼貌的吻别
    2021-01-14 09:01

    I want to try to answer this... It's quite interesting that 2 years and 2 months later I can not figure it out how to easily solve the same problem.

    I'm trying to get the attachment from a response like:

    ...

    headers: { 'cache-control': 'no-cache="set-cookie"', 'content-type': 'multipart/related;boundary="----=_Part_61_425861994.1525782562904";type="application/xop+xml";start="";start-info="text/xml"',

    ...

    body: '------=_Part_61_425861994.1525782562904\r\nContent-Type: application/xop+xml; charset=utf-8; type="text/xml"\r\nContent-Transfer-Encoding: 8bit\r\nContent-ID: \r\n\r\n....\r\n------=_Part_61_425861994.1525782562904\r\nContent-Type: application/octet-stream\r\nContent-Transfer-Encoding: binary\r\nContent-ID: \r\n\r\n�PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0002,\u0000\u0000\u0005�\b\u0006\u0........binary....

    I tried ws.js but no solution.

    My solution:

    var request = require("request");
    var bsplit = require('buffer-split')
    
    // it will extract "----=_Part_61_425861994.1525782562904" from the response
    function getBoundaryFromResponse(response) {
        var contentType = response.headers['content-type']
        if (contentType && contentType.indexOf('boundary=') != -1 ) {
            return contentType.split(';')[1].replace('boundary=','').slice(1, -1)
        }
        return null
    }
    
    
    function splitBufferWithPattern(binaryData, boundary) {
        var b = new Buffer(binaryData),
            delim = new Buffer(boundary),
            result = bsplit(b, delim);
        return result
    }
    
    
    var options = {
        method: 'POST',
        url: 'http://bla.blabal.../file',
        gzip: true,
        headers: {
            SOAPAction: 'downloadFile',
            'Content-Type': 'text/xml;charset=UTF-8'
        },
        body: ''
    };
    
    var data = [];
    var buffer = null;
    var filename = "test.png"
    
    request(options, function (error, response, body) {
            if (error) throw new Error(error);
    
            if (filename && buffer) {
                console.log("filename: " + filename)
                console.log(buffer.toString('base64'))
                // after this, we can save the file from base64 ...
            }
        })
        .on('data', function (chunk) {
            data.push(chunk)
    
        })
        .on('end', function () {
            var onlyPayload = splitBufferWithPattern(Buffer.concat(data), '\r\n\r\n') // this will get from PNG
            buffer = onlyPayload[2]
            buffer = splitBufferWithPattern(buffer, '\r\n-')[0]
            console.log('Downloaded.');
    
        })
    

    I am not sure it will works in most of the cases. It looks like unstable code to my eyes and so I'm looking for something better.

提交回复
热议问题