简体   繁体   English

Jquery ajax在Phonegap中调用RESTful API

[英]Jquery ajax call within Phonegap to RESTful API

I'm trying to make a RESTful api call from the android emulator (using android 2.2). 我正在尝试从android模拟器(使用android 2.2)进行RESTful api调用。 On my server for the login request I'm setting the cors header response.setHeader("Access-Control-Allow-Origin", "*"); 在我的服务器上用于登录请求我正在设置cors标头 response.setHeader("Access-Control-Allow-Origin", "*");

This exact code works fine from Firefox 4 and Chrome 10 and I was led to believe the android browser resolves this header from version 2.1 up . 这个确切的代码在Firefox 4和Chrome 10中运行良好,我被认为Android浏览器从2.1版本解析了这个标题。

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);
    }

});

The server never receives the request and the status code is 0 which I've read can mean a cross scripting error. 服务器永远不会收到请求,状态代码为0,我读过这可能意味着跨脚本错误。 But, as I've said, it works fine in modern browsers. 但是,正如我所说,它在现代浏览器中运行良好。

These are the pertinent logs I see in the LogCat 这些是我在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

As you can see there isn't a whole lot there... makes it a pain to try to debug anything. 正如你所看到的那样,那里没有很多东西......试图调试任何东西都是一种痛苦。

Edit: AndroidManifest.xml permissions 编辑: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" />

This was caused by the android emulator not being able to connect to the internet. 这是因为android模拟器无法连接到互联网。 It was fixed by adding -dns-server XXXX (where XXXX is my dns server) to the "Default emulator options" in the Android preferences in eclipse. 通过将-dns-server XXXX (其中XXXX是我的dns服务器)添加到eclipse中Android偏好设置中的“默认模拟器选项”来修复它。

As you mentioned you are calling RESTful API for login service, I think you need to specify the ajax type to be POST method because it is GET method in default. 正如您所提到的,您正在为登录服务调用RESTful API,我认为您需要将ajax类型指定为POST方法,因为它默认为GET方法。 ie,

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

I think that is why server is not returning any response. 我认为这就是服务器没有返回任何响应的原因。

If this does not fix your problem, could you tell me if you can successfully access other web services (anything on the web) from the application? 如果这不能解决您的问题,您能否告诉我您是否可以从应用程序成功访问其他Web服务(Web上的任何内容)?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM