user3188777
user3188777

Reputation: 128

How To Retrieve Data From Rest API In Appcelerator

I have the misfortune of further developing an existing mobile application in Appcelerator. The app uses a Rest API on a remote server to read and write data. The API works well in test environments and in production. I need to post data to the API and read the output. Here is an example of what the output of the API looks like after a POST command:

{
    "equipment":
    {
        "result": "create",
        "id": 419213
    },
    "_meta":
    {
        "offset": 0,
        "limit": -1,
        "total_results": 1,
        "url": "http://localhost:8080/api/v1/equipment",
        "utc_start_time": 1459449461115,
        "nano_total_time": 74771
    }
}

I am able to successfully post the data in Appcelerator. I have verified this in the database that the CRUD operation is acting on. However, I am unable to get the aforementioned data from the httpClient object that makes the call, despite following the directions in the outdated Titanium documentation.

Here is my Appcelerator code:

var payload = "name=atad&asset_number=adtasd&department_id=185080&property_id=10086&designator_id=379828&is_leased=N&is_assignable_asset=N&status=A";
var url = "http://localhost:8080/api/v1/equipment";

var client = Ti.Network.createHTTPClient({
    onload : function(e) {
        Ti.API.info(e); // {}
        Ti.API.info(e.source); // []
        Ti.API.info(JSON.stringify(e.source)); // {}
        Ti.API.info(JSON.stringify(e.source.reponseText)); // null
        Ti.API.info(JSON.stringify(e.source.reponseData)); // null
        Ti.API.info(this); // []
        console.log(JSON.stringify(this)); // {}
        Ti.API.info(JSON.stringify(this.reponseText)); // null
        Ti.API.info(this.reponseData); // null
    }
    ,onerror : function(e){
        Ti.API.info(e);
        alert("error");
    }
});

var auth = 'Basic ' + Ti.App.Properties.getString('auth');

client.open("POST", apiUrl);
client.setRequestHeader('Authorization', auth);
client.setRequestHeader('Content-Type', 'text/plain');
client.send(payload);

Here is the console output:

[INFO] :   {
[INFO] :       code = 0;
[INFO] :       source = "[object TiNetworkHTTPClient]";
[INFO] :       success = 1;
[INFO] :       type = load;
[INFO] :   }
[INFO] :   [object TiNetworkHTTPClient]
[INFO] :   {"method":"POST","url":"http://localhost:8080/api/v1/equipment"}
[INFO] :   <null>
[INFO] :   <null>
[INFO] :   [object TiNetworkHTTPClient]
[INFO] :   {"method":"POST","url":"http://localhost:8080/api/v1/equipment"}
[INFO] :   <null>
[INFO] :   <null>

The documentation here http://docs.appcelerator.com/platform/latest/#!/api/Titanium.Network.HTTPClient explicitly says to use this.responseText, but that is clearly not giving me the results I need. I need that "id" that is being returned from the server.

How do I read the data that is returned from the server after a post API call?

Upvotes: 0

Views: 1306

Answers (3)

Nils
Nils

Reputation: 164

There is just a typo in this.responseText

Upvotes: 1

Newport99
Newport99

Reputation: 483

It looks like the apiUrl variable is not defined?

Which could explain a lot or your current frustration.

Upvotes: 0

miga
miga

Reputation: 4055

Have a look at this module: https://github.com/jasonkneen/RESTe

It makes your life easier and gives you a great way to the same syntax for future projects!

If you want to keep your syntax (which is fine too):

have a look at this example: https://github.com/m1ga/titanium-libraries/blob/master/api.js#L49 and the following lines. It shows you how to read the JSON. Basically you have to wait for if (this.readyState === 4) {} inside the onload and then read the this.responseText or JSON.parse() it.

Upvotes: 0

Related Questions