Fetch API无法加载file:///android_asset/www/xx/xxx.json。 URL方案"文件"不受支持

时间:2017-05-31 07:29:06

标签: android cordova fetch-api

使用 cordova 构建 Android应用,并添加 cordova热门代码插件,以便自动更新应用,并使用 Fetch API 加载位于当前项目目录中的 JSON文件,问题是更新应用程序时,任何JSON文件都无法重新加载,并抛出错误

  

Fetch API无法加载file:///android_asset/www/xx/xxx.json。网址   方案"文件"不受支持。

如何在Android应用中解决此Fecth错误?或者是否有任何需要添加到我的cordova项目的插件?

4 个答案:

答案 0 :(得分:2)

https://github.com/github/fetch/pull/92#issuecomment-140665932

您可以使用XMLHttpRequest来加载本地资产。

答案 1 :(得分:1)

我遇到了同样的问题,因为在Android中使用fetch()(使用Cordova)使用了file://协议,因为使用了相对URL来获取Android中Cordova应用程序中的资源,错误。

Jan的回答和MDN网络文档中的以下页面共同解决了我的问题:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data

就我而言,这与以下事实有关:使用fetch检索音频文件,我可以在响应中调用arrayBuffer(),但在示例{{1 }}所关联的功能。

诀窍是需要在XHR对象上设置fetchLocal()

我的responseType函数如下所示:

fetchLocal

为我解决的事情是添加以下行:

function fetchLocal(url) {
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest
        xhr.onload = function () {
            resolve(new Response(xhr.response, { status: xhr.status }))
        }
        xhr.onerror = function () {
            reject(new TypeError('Local request failed'))
        }
        xhr.open('GET', url)
        xhr.responseType = "arraybuffer";
        xhr.send(null)
    })
};

答案 2 :(得分:0)

我使用以下代码避开了use strict; use warnings; use feature qw( say ); my $i = 12; my @ST; # Stack { push @ST, \( $i ); } { push @ST, \( 2 ); } { my ($lhs_p, $rhs_p) = splice(@ST, -2); push @ST, \( $$lhs_p /= $$rhs_p ); } { push @ST, \( 100 ); } { push @ST, \( $i ); } { my ($rhs_p, $lhs_p) = splice(@ST, -2); push @ST, \( $$lhs_p = $$rhs_p ); } { my ($lhs_p, $rhs_p) = splice(@ST, -2); push @ST, \( my $sum = $$lhs_p + $$rhs_p ); } { push @ST, \( $i ); } { my ($rhs_p, $lhs_p) = splice(@ST, -2); push @ST, \( $$lhs_p = $$rhs_p ); } say $i; # 200 的类似问题。我不想使用Jan答案中链接中的代码,因为我不想手动流式传输数据(该代码产生的响应对象没有fetch()属性)。

responseText

答案 3 :(得分:0)

使用 axios:

const blob = await axios.get(url, { responseType: 'blob'}).then(resp => resp.data)