【问题标题】:Jquery ajax call within Phonegap to RESTful APIPhonegap中的Jquery ajax调用到RESTful API
【发布时间】:2011-03-29 21:17:08
【问题描述】:

我正在尝试从 android 模拟器(使用 android 2.2)进行 RESTful api 调用。在用于登录请求的服务器上,我正在设置 cors header response.setHeader("Access-Control-Allow-Origin", "*");

这个确切的代码在 Firefox 4 和 Chrome 10 上运行良好,我被引导相信 android 浏览器从版本 2.1 up 解析这个标头。

usr = $("#email").val();
pwd = $("#password").val();

$.ajax({
    url: "http://myremoteserver/login",
    data: {"username": escape(usr), "password": escape(pwd)},
    dataType: "json",
    headers: {"Accept": "application/json"},
    success: function(response) {
      console.log("Success: " + response);
      if (response.result == "success") {
        //doStuff
      }
      else {
        console.log("Success Error: " + response);
        $("#error").html(response);
      }
    },
    error: function(request, status, error) {
      console.log("Error status " + status);
      console.log("Error request status text: " + request.statusText);
      console.log("Error request status: " + request.status);
      console.log("Error request response text: " + request.responseText);
      console.log("Error response header: " + request.getAllResponseHeaders());
      $("#error").html(status);
    }

});

服务器从不接收请求,状态码为 0,我读过这可能意味着交叉脚本错误。但是,正如我所说,它在现代浏览器中运行良好。

这些是我在 LogCat 中看到的相关日志

03-29 20:30:46.935: DEBUG/PhoneGapLog(277): file:///android_asset/www/index.html: Line 36 : Error status error
03-29 20:30:46.935: INFO/Web Console(277): Error status error at file:///android_asset/www/index.html:36
03-29 20:30:46.954: DEBUG/PhoneGapLog(277): file:///android_asset/www/index.html: Line 37 : Error request status text: error
03-29 20:30:46.954: INFO/Web Console(277): Error request status text: error at file:///android_asset/www/index.html:37
03-29 20:30:46.985: DEBUG/PhoneGapLog(277): file:///android_asset/www/index.html: Line 38 : Error request status: 0
03-29 20:30:46.985: INFO/Web Console(277): Error request status: 0 at file:///android_asset/www/index.html:38
03-29 20:30:47.003: DEBUG/PhoneGapLog(277): file:///android_asset/www/index.html: Line 39 : Error request response text: 
03-29 20:30:47.003: INFO/Web Console(277): Error request response text:  at file:///android_asset/www/index.html:39
03-29 20:30:47.034: DEBUG/PhoneGapLog(277): file:///android_asset/www/index.html: Line 40 : Error response header: 
03-29 20:30:47.034: INFO/Web Console(277): Error response header:  at file:///android_asset/www/index.html:40
03-29 20:33:38.704: DEBUG/SntpClient(65): request time failed: java.net.SocketException: Address family not supported by protocol

正如您所见,那里并没有很多东西......尝试调试任何东西都很痛苦。

编辑: AndroidManifest.xml 权限

  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.RECEIVE_SMS" />
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  <uses-permission android:name="android.permission.READ_CONTACTS" />
  <uses-permission android:name="android.permission.WRITE_CONTACTS" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

【问题讨论】:

  • 你能输出error.message而不是error吗?
  • @knoguchi console.log(error.message);给我:未定义
  • 哦,是的,我把它和本地存储混在一起了。您是否在 android manifest xml 文件中设置了互联网访问权限?
  • @knoguchi 是的 - 我已经编辑了我的帖子以包含我的 AndroidManifest.xml 的权限部分
  • 如果服务器根本没有收到请求,状态码0可能表示防火墙有问题。您是否尝试将其关闭?

标签: javascript jquery android rest cordova


【解决方案1】:

这是由于安卓模拟器无法连接到互联网造成的。通过将-dns-server X.X.X.X(其中 X.X.X.X 是我的 dns 服务器)添加到 Eclipse 中 Android 首选项中的“默认模拟器选项”来解决此问题。

【讨论】:

    【解决方案2】:

    正如您提到的,您正在为登录服务调用 RESTful API,我认为您需要将 ajax 类型指定为 POST 方法,因为它默认为 GET 方法。即,

    $.ajax({ type: 'POST', ... });

    我认为这就是服务器没有返回任何响应的原因。

    如果这不能解决您的问题,您能否告诉我您是否可以从应用程序成功访问其他网络服务(网络上的任何内容)?

    【讨论】:

    • 我会先说 Phonegap 可能不是满足我需求的正确工具,但我有几个问题。我正在尝试获取信息(这是一个有效的登录名吗?)因此它应该是一个 GET 请求。其次,GET 请求实际上在 FF4 和 Chrome 10 中有效。可能是 phonegap 需要提供一个插件来访问手机网络功能才能“正确”执行此操作。
    • 嗯,我实际上制作了 phonegap 应用程序,它使用 ajax 发送请求并且没有问题。您可能想看看 ajax 请求是否适用于不同的服务器,例如 www.google.com(如果您仍然想使用 phonegap ofcourse :))。
    • 可能问题出在模拟器上。当我记得带上我的 USB 适配器来工作时,我会尝试使用真正的手机。
    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多