在ServiceNow中从REST调用中获取PNG图像作为响应,但响应是乱码字符。

3
我在这里遇到一个情况,在ServiceNow中通过REST调用获取PNG图像作为响应,但是响应以垃圾字符的形式显示。我正在编写服务器脚本来接收响应并将其转换成某些字符串,然后将其返回给客户端UI操作脚本,以便将其作为图像呈现回UI页面。如果有人遇到类似的情况,请分享一下。任何帮助都将不胜感激。
REST响应:
    IHDRU�  ��bKGD������� IDATx��{\T��� o"r�("r ���J(/���L��f�Syˬcio ��x��T�
    S�$=��JO�GE1 �xA@ T  �\��g���53kX��}? >ʞg�<���ڿ��� �/_V� � �Л���hj A A r������Ro�ݻwS�!� ��%���@�*� � c@�*� � #@�*� � #`�[B A a~DEE5�=44���T�"� �h���P���bԨQ�� �*UA A Z(++Crr2,--��� ++�C' T A A4��۷����nݺ�gϞ8�<z��UO�*� � �x��!� 
    kkk@HHH�z T A A4@nn.rss�m���A A  �Du� � #A � � �  �&����ӧn��M� �  ���zPU^��|�)`�/���u�&vD A DS�:Q�U·����=���.X�Ď� �hj,,,0z�hXXXT* ���������{�p��o5����[�� � ���� ������AMM 233akk�Uo����W���\�{Uy9��^݄�� � �~��!++ ǎ ñcǐ��   �z� TM  ����(�9 o''���dL  k�9YYY��g�@ٱcLz�^X�r� �y��E��Y�� ��r�ͪ�kVx�f��5+��vJ��� � Ƙ1c0f�   < gΜѪ7�A�>TTTp��E�v�xa���7�杧 ��f�SV ���7�^�Y��U/׬���� ���666�t���\�P]Q����E/W��w�^��UOY1\/W�O�-.Z���M�]�Ӹx�k�Y�r�
    KN��Y)..��1����� �/_V@�޽�b@�|��'X�n]S� �h�T�*��R+IZ�@ g7������ c � "**�ޒ
    ������^��I?rb�@��EHE�¢��o��;O/r�ͪ�� ���o����T�vR� �jʸx�k�Y�r�
    KN�ڬ��� �*++�P(���HOO��$ �� R�9..Lz��Y|����;== 6���>O��S ߬z ߼�o<��<s+W�j}��L��ҫ�ӺءBU!��M����� �_aɉ�� ?{��<?%%
    ��y��T ��2��{ �鿴�4��� ] � %�0�*��  �\}l�yz��oV=e�p�\}�� = `�^�vR� ���;K;�{�k�Y�r�
    KN�ڬ�47S�N������͛��lll��� GG�::��? T=��T A�E�= �ߔ�I���% ���KN>s�� ?�~��iQyyyHLLDppp  ͩ2Q�g��"� �'�0��f�SV ��
....truncated since its too long

所以我清楚了——客户端发出请求,服务器用某种二进制到字符串的PNG表示法进行响应,您想在客户端将“PNG字符串”转换回图像? - Willy
在Servicenow中,有一个目录客户端脚本调用服务器脚本,服务器脚本调用REST调用(这是一个单独的模块,它处理REST消息),REST调用的响应是原始垃圾,如帖子中所述。因此,在服务器脚本中,我必须将其转换为一些Base64格式,然后将其发送回客户端脚本,间接地发布在UI页面上。 - user3337753
1个回答

0

你正在以二进制形式传递数据...旧版的JavaScript无法处理二进制数据。

这是显示Ajax图片的正确/现代方式。

但要检查兼容性...

https://developer.mozilla.org/en-US/docs/Web/API/URL.revokeObjectURL

function showImg(e){
 var img=document.createElement('img');
 img.onload=function(e){
  document.body.appendChild(img);
  window.URL.revokeObjectURL(img.src);//Clear
 };
 img.src=window.URL.createObjectURL(this.response);
}

window.URL=window.URL||window.webkitURL;

var xhr=new XMLHttpRequest;
xhr.open('GET','/path/to/image.png',true);
xhr.responseType='blob';//Blob
xhr.onload=showImg;
xhr.send();

有一种更兼容的方式可以实现这个。

new Uint8Array

但是我注意到了一些内存泄漏。

如果你想的话,我也可以发布那段代码。


感谢您的快速回复。 - user3337753
如果您计划使用此脚本,请注意它所使用的内存...它非常占用内存。因此,请正确地删除每个您创建的图像,否则它将很快被填满。顺便说一句,我没有投反对票...这也发生在我身上。 - cocco
问题在于我正在使用ServiceNow提供的REST API,这是脚本包含(服务器脚本)的外观,它基本上执行所有服务器端处理。var tmk_pull_graphs = Class.create();tmk_pull_graphs.prototype = object.extendsObject(AbstractAjaxProcessor,{ getgraphresponse: function() {var r = new RESTMessage('tmk_xxxxx_get_graph', 'get');r.setStringParameter('graphurl', this.getParameter('sysparm_io'));var response = r.execute(); 因此,需要将响应对象转换为base64格式,以便可以将其发送到客户端脚本并呈现为img src="data:image/png;base64 - user3337753
window.URL.createObjectURL == data:image/png;base64,测试代码并检查图像链接。 - cocco
但我需要将以base64格式获取的原始数据转换,然后才能将其发送到客户端脚本,该脚本将其作为data:image/png;base64{response}发送到UI页面。我发现很难找到JavaScript API来转换这个数据。 - user3337753
1
我认为在你使用的库中也有一个将数据转换的函数。我向你展示了现代/本地的做法。 - cocco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接