NodeJS Axios返回二进制数据而不是XML

ffscu2ro  于 2022-12-03  发布在  Node.js
关注(0)|答案(3)|浏览(70)

过去几个小时我一直在想Axios为什么要这么做。
我试着在nodeJS的请求库中这样做,它工作得很好,但Axios不行。
实际上,我所做的就是发送一个XML数据请求:

var options = {
        'method': 'POST',
        'url': 'https://rvices.svc',
        'headers': {
          'Content-Type': 'text/xml; charset=utf-8',
          'SOAPAction': 'http://etProject'
        },
        data: xmlData};

XML数据看起来类似于:

let xmlData = `<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://p" xmlns:pws="http://"

等等(它有大部分的私人数据在它,所以我剥离了大部分)。
当我尝试使用axios来得到这个

const testData = await axios(options)

我得到了一大堆代码,看起来像这样:

'���_\x1B�\f�10�\x17�Ч�{O�\x00��5h�S�������\x0F���s�(+Ғ�\x0F�����m�\x15\x01\x13��6b��\x06%\x00��\x15p8<;��W�4����\x0B���\x01���e�\x7FvZ�{���Ï������\x06��-�z��\x01}�!�r�A�\x13��\x11O�w6ũ���{�\x03����;{����\x01\x7Fy��KoՎ���\x1Bߚe��W��mЇ�qD�a��[�7Ӄ���@��F<\x1C/mF�{\x03�h��#�\x16�\x11\x1F\x1F�L9\x0FM\x8A\x0E�\x
17�h���\x03�4�7�f=bj*8�p�\x13_�\x17�5���_�Ӑ�|M>����\r��F�8q�iE�#��\x0E?�v�������O�xq3���x�Q�튱\x1F?G&HG9��6���V\x1B⫯Ev\x01rc\x13\x10�\'�7��`�Ii��x�~LM6�#˒74#@�����f�*\x7F\x16(5|\x1CWl��\x07\t\x1F��z�\x15\x00\x1B��4�\x13���LCTG�\x1FI�����\fec�h\x02�~��i`�:Ғ�\x0F���y\b#�]V��g��Ӈ�\x14|���6~\x19~c`�/�O���M\x01��k\x
10�\'+���\x07S\r?|��T�A�\x0FӒ�\x0F��ܷ\'.s�!>�tbX\x05�\fs\x18�\r�"`���\x10lV٠\x05@ܲ�\x02\x0E\x07h���\n' +
    '���[�7}�>54 r�����ʦ\x15�\x17��\x0E:

这是正确的字符数(100 k+),但混乱
与使用返回xml的request执行此操作相比,我期望ala:

</b:ProjectTaskTypeDetail></b:PwsProjectTaskTypeElement><b:PwsProjectTaskTypeElement><b:ProjectTaskTypeDetail><b:ExternalSystemIdentifier i:nil="true"/><b:ProjectTaskTypeId i:nil="true"/><b:ProjectTaskTypeUid>5776</b:ProjectTaskTypeUid><b:ProjectTaskTypeName>Faon</b:Proj
ectTaskTypeName>

我注意到的一件事是Axios将我的请求分成多行,如下所示:

'<com:PwsProjectRef><com:ProjectCode>201268</com:ProjectCode></com:PwsProjectRef>\n' +
      '\n' +
      '<com:PwsProjectRef><com:ProjectCode>210115-01</com:ProjectCode></com:PwsProjectRef>\n' +
      '\n' +

即使我的请求中没有\n“s”或类似的中断。
所以我想知道是否有人遇到过这个问题,知道如何解决它?
请求是工作,但请求(从我可以告诉?)不工作的异步代码(我可能是错误的这一点)
抱歉我说得太含糊了!

62o28rlo

62o28rlo1#

您应该使用responseType配置选项来设置反映Accept HTTP header而不是Content-Type的预期响应:

const options = {
    method: 'POST',
    url: 'https://rvices.svc',
    headers: {
      'Content-Type': 'text/xml; charset=utf-8',
      'SOAPAction': 'http://etProject'
    },
    data: xmlData,
    responseType: 'document',
    responseEncoding: 'utf8'
};

const testData = await axios(options);
fhity93d

fhity93d2#

尝试使用此代码
保存为get-data.js文件
第一个

b4lqfgs4

b4lqfgs43#

响应以压缩的二进制格式返回,但Axios不理解从服务器返回的压缩格式。请尝试强制响应使用axios理解的特定压缩算法,如“deflate”。“gzip”也可能有效。
axios的“解压缩”选项告诉axios自动解压缩二进制数据。

var options = {
        'method': 'POST',
        'url': 'https://rvices.svc',
        'headers': {
          'Accept-Encoding': 'deflate'
          'Content-Type': 'text/xml; charset=utf-8',
          'SOAPAction': 'http://etProject'
        },
        data: xmlData,
        decompress: true    
     };

相关问题