2016-03-31 9 views
0

Ich habe das Pech, eine bestehende mobile Anwendung in Appcelerator weiter zu entwickeln. Die App verwendet eine Rest-API auf einem Remote-Server zum Lesen und Schreiben von Daten. Die API funktioniert gut in Testumgebungen und in der Produktion. Ich muss Daten an die API senden und die Ausgabe lesen. Hier ist ein Beispiel dafür, was die Ausgabe der API sieht aus wie nach einem POST-Befehl:Wie Abrufen von Daten aus Ruhe API In Appcelerator

{ 
    "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 
    } 
} 

ich in der Lage bin, um erfolgreich die Daten in Appcelerator zu posten. Ich habe dies in der Datenbank verifiziert, auf die die CRUD-Operation wirkt. Allerdings kann ich die oben genannten Daten nicht von dem httpClient-Objekt abrufen, das den Aufruf ausführt, obwohl ich die Anweisungen in der veralteten Titanium-Dokumentation befolge.

Hier ist mein 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); 

Hier ist die Ausgabe der Konsole:

[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> 

Die Dokumentation hier http://docs.appcelerator.com/platform/latest/#!/api/Titanium.Network.HTTPClient sagt ausdrücklich this.responseText zu verwenden, aber das gibt mir eindeutig nicht die Ergebnisse, die ich brauche. Ich brauche diese "ID", die vom Server zurückgegeben wird.

Wie lese ich die Daten, die nach einem Post-API-Aufruf vom Server zurückgegeben werden?

Antwort

1

Es gibt nur ein Tippfehler in this.re s ponseText

+0

einfach so! Jede "Antwort" ist falsch in ihrem/ihrem Code –

+0

Ja, es sieht so aus, als ob das alles wäre. Danke. Ich verstehe nicht, warum die Ausgabe von this.response nicht in der Konsole für die Zeile "console.log (JSON.stringify (this))" erscheint. – user3188777

0

Werfen Sie einen Blick auf dieses Modul: https://github.com/jasonkneen/RESTe

Es Ihnen das Leben leichter macht und gibt Ihnen eine gute Möglichkeit, auf die gleiche Syntax für zukünftige Projekte!

Wenn Sie Ihre Syntax halten (was auch in Ordnung ist):

haben einen Blick auf dieses Beispiel: https://github.com/m1ga/titanium-libraries/blob/master/api.js#L49 und die folgenden Zeilen. Es zeigt Ihnen, wie Sie das JSON lesen. Grundsätzlich müssen Sie auf if (this.readyState === 4) {} innerhalb der onload warten und dann lesen Sie die this.responseText oder JSON.parse() es.

0

Es sieht so aus, als ob die apiUrl Variable nicht definiert ist?

Das könnte viel oder Ihre aktuelle Frustration erklären.

+0

Das ist eine gute Vermutung ist. Dieser Teil des Codes wurde jedoch von Hand geschrieben, um den Code für die Anzeige hier einfacher zu machen. Der Eigenname der Variablen sollte apiUrl sein. Es scheint an dieser Stelle klar zu sein, dass ich keine Tippfehler mache. – user3188777