Javascript 调用RESTAPI以获取图像

Javascript 调用RESTAPI以获取图像,javascript,rest,vue.js,Javascript,Rest,Vue.js,我正在从我的Vue代码调用RESTAPI,如下所示 let file = BASEURL + 'download/' + docId; let headers = new Headers(); headers.append('Authorization', 'Bearer ' + TOKEN); headers.append('Accept', 'application/json'); fetch(file, { headers }) .then(response => {return

我正在从我的Vue代码调用RESTAPI,如下所示

let file = BASEURL + 'download/' + docId;

let headers = new Headers();
headers.append('Authorization', 'Bearer ' + TOKEN);
headers.append('Accept', 'application/json');

fetch(file, { headers })
.then(response => {return response.data})
预期的数据是base64映像,但我得到了返回的垃圾数据。 我错过了什么

当我查看开发工具中的“网络”选项卡时,我得到

ÿØÿa JFIFÿC

ÿÛC


ÿXÿÿÿÿÄB!1AQÿBRÁ3b$Cráðñ%4SÿÄÿ5!1“AQ2aq#BÁ3ðñR$C+.CµHIíçrI1ødcniÒV

您正在输出原始二进制响应

看到您试图访问data属性,我假设响应格式是一个JSON字符串,其数据属性是一个表示图像的base64字符串

fetch(file, {
    headers: {
        'Authorization': 'Bearer ' + TOKEN,
        'Accept': 'application/json'
    }
}) // Get data from endpoint
.then(response => response.json()) // Parse response as JSON
.then(response => response.data) // Get data property from response object
如果整个响应是base64字符串,而不是带有base64字符串的JSON对象,则可以执行以下操作

fetch(file, {
    headers: {
        'Authorization': 'Bearer ' + TOKEN,
        'Accept': 'plain/text'
    }
}) // Get data from endpoint
.then(response => response.text()) // Parse response as plain text

同样如上所示,您需要使用Accept头告诉服务器您期望的响应格式。

您正在输出原始二进制响应

看到您试图访问data属性,我假设响应格式是一个JSON字符串,其数据属性是一个表示图像的base64字符串

fetch(file, {
    headers: {
        'Authorization': 'Bearer ' + TOKEN,
        'Accept': 'application/json'
    }
}) // Get data from endpoint
.then(response => response.json()) // Parse response as JSON
.then(response => response.data) // Get data property from response object
如果整个响应是base64字符串,而不是带有base64字符串的JSON对象,则可以执行以下操作

fetch(file, {
    headers: {
        'Authorization': 'Bearer ' + TOKEN,
        'Accept': 'plain/text'
    }
}) // Get data from endpoint
.then(response => response.text()) // Parse response as plain text

同样如上所示,您需要告诉服务器使用Accept头需要什么样的响应格式。

因此,问题似乎是服务器使用通用MIME类型来返回文件,即
应用程序/octet流
,而不是特定图像的正确MIME类型,即
图像/jpg
。这就解释了为什么浏览器无法呈现图像,而您会得到您认为是“垃圾”的内容(它实际上只是图像二进制内容的ASCII表示)

如果它是一个文件,因此是一个流,您可以使用响应对象上的函数来读取数据。实际上,有一个很好的方法可以帮助您使用Fetch API下载图像并将其渲染为图像,您应该能够调整该图像以满足您的需要:

const image = document.querySelector('.my-image');
fetch('flowers.jpg').then(function(response) {
  return response.blob();
}).then(function(blob) {
  const objectURL = URL.createObjectURL(blob);
  image.src = objectURL;
});

因此,问题似乎是服务器正在使用通用MIME类型返回文件,即
应用程序/八位字节流
,而不是特定图像的正确MIME类型,即
图像/jpg
。这将解释为什么浏览器无法呈现图像,而您得到的是您认为正确的MIME类型。”垃圾”(它实际上只是图像二进制内容的ASCII表示)

如果它是一个文件,因此是一个流,您可以使用响应对象上的函数来读取数据。实际上,有一个很好的方法可以帮助您使用Fetch API下载图像并将其渲染为图像,您应该能够调整该图像以满足您的需要:

const image = document.querySelector('.my-image');
fetch('flowers.jpg').then(function(response) {
  return response.blob();
}).then(function(blob) {
  const objectURL = URL.createObjectURL(blob);
  image.src = objectURL;
});

取决于你所说的“垃圾”是什么意思-你能展示一个API返回什么的例子吗?你能确定服务器API代码吗?不幸的是不能。但我知道API在没有授权的情况下可以在下载属性中正常工作。因为我需要授权,所以我必须在javascript@user2837961如果你不能确定代码,那么你能解释一下“垃圾”是什么意思吗“,那么你从服务器上得到了什么?您得到了什么?在网络选项卡中,
内容类型
标题显示了什么?数据需要以相关格式进行分析,例如,
response.text()
响应头中的内容类型是应用程序/octet流取决于“垃圾邮件”的含义-您能否给出API返回内容的示例?你能确定服务器API代码吗?不幸的是不能。但是我知道API在没有授权的情况下可以在下载属性中正常工作。因为我需要授权,所以我必须在javascript@user2837961如果你不能确定代码,那么你能解释一下你所说的“垃圾”是什么意思,这样你就可以从服务器上得到一些东西了吗?您得到了什么?在网络选项卡中,
内容类型
标题显示了什么?需要以相关格式解析数据,例如响应头中的
response.text()
内容类型为application/octet-stream@James,啊,这确实很奇怪,因为在这种情况下,开发工具本身已经在处理解析和表示:/@James,啊,这确实很奇怪,因为在这种情况下,开发工具本身已经在处理解析和表示了:/