当前位置: 首页 > 面试题库 >

Phonegap Android应用程序对HTTPS的ajax请求失败,状态为0

蔡楚
2023-03-14
问题内容

来自Android上我的PhoneGap / Cordova应用的Ajax HTTPS请求莫名其妙地失败,状态为=
0。仅在使用释放键对应用程序进行签名(即从ADT导出)时显示,而在使用调试键进行签名(直接在模拟器或电话中运行)时不显示。

request = new XMLHttpRequest()
request.open "GET", "https://some.domain/", true
request.onreadystatechange = ->
  console.log "** state = " + request.readyState
  if request.readyState is 4
      console.log "** status = " + request.status

request.send()

总是输出

** state = 4
** status = 0

不管我是从Play商店还是通过adb实用工具安装应用程序,都没有关系。我认为它可以与证书连接,因为并非所有HTTPS域都以这种方式失败。


问题答案:

当请求的URL响应错误或自签名证书时,就会发生这种情况。在测试或发布应用程序的朋友,设置<application android:debuggable="true"...>AndroidManifest.xml是不够的-它会自动绕过证书错误。

但是Google Play商店不接受带有的APK
android:debuggable="true"。首先,当然需要对证书进行固定。但是,在这种情况下,这是PhoneGap / Cordova
3的解决方法:

  1. 在您的应用包中,为创建一个子类CordovaWebViewClient
        public class SSLAcceptingCordovaWebViewClient extends CordovaWebViewClient {
        public SSLAcceptingCordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
            super(cordova, view);
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();
        }
    }
  1. 相同IceCreamCordovaWebViewClient
        public class SSLAcceptingIceCreamCordovaWebViewClient extends IceCreamCordovaWebViewClient {
        public SSLAcceptingIceCreamCordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
            super(cordova, view);
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();
        }
    }
  1. <Your App Name>.java添加替代makeWebViewClient
        @Override
    protected CordovaWebViewClient makeWebViewClient(CordovaWebView webView) {
        if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
            return new SSLAcceptingCordovaWebViewClient(this, webView);
        } else {
            return new SSLAcceptingIceCreamCordovaWebViewClient(this, webView);
        }
    }

等等! SSL错误将被忽略。但是,切勿使用错误的证书。尝试先修复它们,然后仅在用完其他解决方案时才使用此肮脏的解决方法。



 类似资料:
  • 这是我的同意模式 这是同意控制器获取声明 这是声明后的同意 同意html thymeleaf表单是 提交表格后。我得到这个错误 HTTP状态500-请求处理失败;嵌套异常是org.thymeleaf.exceptions.TemplateProcessing异常:异常评估SpringEL表达式:"user.providers"(提供者/createOrUpdateConentForm 组织。spr

  • 问题内容: IE中的以下AJAX调用失败。 错误函数返回 没有向服务器发出请求,因此我认为JSON没有问题。 已修复,请参阅#1351389 问题答案: 固定,我将content-type从更改为just plain 。 我讨厌IE :) 另外,为了避免IE超级缓存,请尝试以下操作: 这样,每个请求都是IE获得:D的新网址

  • 问题内容: 似乎只有在ajax请求能够从服务器获得某些响应时,才会触发成功,错误和完整的回调。 因此,如果我关闭服务器,则不会执行以下错误回调,并且请求将以静默方式失败。 当根本无法访问服务器时,抛出错误的最佳方法是什么。 编辑-从我尝试过的内容来看,似乎jQuery的内置错误处理不适用于JSONP或dataType:“ script”。因此,我将尝试设置手动超时。 编辑-做了一些进一步的研究,看

  • 在函数方法POST中,当表单提交时,它不起作用。我有错误: xhr.js?b50d POST https://app/login 400(错误请求) 错误:请求失败,在createError(createError.js?2d83)处,在xmlHttpRequest.handleLoad(xhr.js?B50d)处,在settle(settle.js?467f)处,状态代码为400 登录 在邮递员

  • 请求: 主机:Tempuri.org用户代理:Mozilla/5.0(Windows NT 6.1;WOW64;RV:37.0)Gecko/20100101 Firefox/37.0接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8接受-语言:en-US,en;q=0.5接受-编码:gzip,deflate来源:http