Jquery ajax call within Phonegap to RESTful API

10,442

This was caused by the android emulator not being able to connect to the internet. It was fixed by adding -dns-server X.X.X.X (where X.X.X.X is my dns server) to the "Default emulator options" in the Android preferences in eclipse.

Share:
10,442
Josh
Author by

Josh

Software developer in Atlanta.

Updated on June 04, 2022

Comments

  • Josh
    Josh almost 2 years

    I'm trying to make a RESTful api call from the android emulator (using android 2.2). On my server for the login request I'm setting the cors header 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.

    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. But, as I've said, it works fine in modern browsers.

    These are the pertinent logs I see in the 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

      <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" />
    
  • Josh
    Josh about 13 years
    I'll preface this by saying Phonegap may just not be the right tool for my needs, but I have several problems with this. I'm trying to get information (is this a valid login?) therefor it should be a GET request. Second, the GET request actually works in FF4 and Chrome 10. It may be that phonegap needs to provide a plugin to access the phones network capabilities in order to do this "correctly".
  • katsuya
    katsuya about 13 years
    Hmmm I actually made phonegap app that sends request with ajax and there is no problem with it. You probably want to see if ajax requests work with different server like www.google.com (If you still want to use phonegap ofcourse :) ).
  • Josh
    Josh about 13 years
    Perhaps the problem lies with the emulator. I'll try a real phone when I remember to bring my USB adapter in to work.