离子请求仅在Android上返回404,在Chrome中它可以正常工作

时间:2015-04-23 14:47:03

标签: android angularjs http ionic-framework ionic

所以,我已经从离子克隆了教程app repo。我跑了

ionic start conference sidemenu

然后我添加了一个简单的$ http.get('myserver')(我也试过了ngResources)。

它在chrome上运行得很完美,我得到了所有数据但是在角度上我只有空数据和404状态在我试图做的任何请求。

注意:我尝试使用托管服务器和本地服务器。两者都在Android上失败。 Server是node.js REST API。

控制台上没有打印任何内容,因此请求甚至无法到达服务器。

有没有人经历过这个或者可以告诉我如何调试使用Ionic构建的Android应用程序?

编辑1:我不知道你为什么需要它,但这里是

$http.get('http://server.com/route').success(function (data) {
            //handle success
        }).error(function (data, status) {
            // handle error
        });

4 个答案:

答案 0 :(得分:87)

事情是Cordova 4.0.0有一些重大变化:

  

重大变化   [...]    - 白名单功能现在通过插件(CB-7747)提供      白名单已得到增强,更安全,可配置      现在,框架支持设置Content-Security-Policy      (请参阅插件自述文件中的详细信息)您需要添加新的      cordova-plugin-whitelist插件遗留白名单行为仍然存在      可通过插件获得(虽然不推荐)。

所以我安装了Cordova Whitelist plugin。并添加了

<allow-navigation href="http://*/*" />

在我的config.xml文件中。

答案 1 :(得分:1)

就我而言,问题出在cordova-plugin-whitelist插件上。我刚刚删除了插件并添加了它。通过添加此代码还启用了所有请求 <access origin="*" />中的config.xml。请找到以下命令:

您需要使用以下命令删除现有插件:

ionic cordova plugin rm cordova-plugin-whitelist

然后只需使用以下命令将其添加:

ionic cordova plugin add cordova-plugin-whitelist

希望有帮助。

答案 2 :(得分:0)

你应该在本地内容,当cordova编译是一个 www 文件夹时,它们是资产和其他文件夹,你实现了apk或同等的iOS

<img src="assets/images/{your-file-name}">

答案 3 :(得分:0)

如果以前的解决方案不适用于离子3。 谢谢@rickie最后一个真正的解决方案,三天的痛苦!!!现在还可以转到\platforms\android\CordovaLib\src\org\apache\cordova\engine\SystemWebViewClient.java并对此行发表评论:

public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
    try {
        // Check the against the whitelist and lock out access to the WebView directory
        // Changing this will cause problems for your application
      /*  if (!parentEngine.pluginManager.shouldAllowRequest(url)) {
            LOG.w(TAG, "URL blocked by whitelist: " + url);
            // Results in a 404.
            return new WebResourceResponse("text/plain", "UTF-8", null);
        }*/

        CordovaResourceApi resourceApi = parentEngine.resourceApi;
        Uri origUri = Uri.parse(url);
        // Allow plugins to intercept WebView requests.
        Uri remappedUri = resourceApi.remapUri(origUri);

        if (!origUri.equals(remappedUri) || needsSpecialsInAssetUrlFix(origUri) || needsKitKatContentUrlFix(origUri)) {
            CordovaResourceApi.OpenForReadResult result = resourceApi.openForRead(remappedUri, true);
            return new WebResourceResponse(result.mimeType, "UTF-8", result.inputStream);
        }
        // If we don't need to special-case the request, let the browser load it.
        return null;
    } catch (IOException e) {
        if (!(e instanceof FileNotFoundException)) {
            LOG.e(TAG, "Error occurred while loading a file (returning a 404).", e);
        }
        // Results in a 404.
        return new WebResourceResponse("text/plain", "UTF-8", null);
    }
}