2016-06-20 4 views
1

Ich arbeite an einem Forschungsprojekt an meiner Universität mit der WeatherHawk 916 Wireless Weather Station und benutze das damit verbundene IP Module, um die Wetterdaten auf dem Campus verfügbar zu machen ' Netzwerk.Meteor HTTP 'GET' Anfrage bekommt keine XML-Datei

Um auf die Daten zuzugreifen, müssen Sie eine IP-Adresse in einen Webbrowser eingeben und die Daten werden wie folgt angezeigt: Weather Station Website. Der Server des IP-Moduls bietet die Daten auch als XML an (was mich interessiert, damit ich es mit Meteors HTTP 'GET' abrufen und parsen kann). Wenn Sie auf "Öffentliche XML-Tabelle abrufen" klicken, wird diese Seite angezeigt: XML Data.

Wenn ich die Meteor 'GET' HTTP-Anfrage auf der Hauptseite, die nur '10 .181.160.100' ist, bekomme ich die ganze HTML-Seite ohne Probleme zurück, was gut ist. Allerdings, wenn ich versuche, die XML erhalten von '10 .181.160.100/get_public_tbl.cgi A = 1' , bekomme ich folgende Fehlermeldung:?

I20160620-17:41:11.662(-4)? Exception while invoking method 'xmlDemo' Error: Parse Error 
I20160620-17:41:11.833(-4)?  at Object.Future.wait (/Users/melkisespinal/.meteor/packages/meteor- tool/.1.3.3_1.ajs0iq++os.osx.x86_64+web.browser+web.cordova/mt- os.osx.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:449:15) 
I20160620-17:41:11.834(-4)?  at Object.call (packages/meteor/helpers.js:119:1) 
I20160620-17:41:11.834(-4)?  at [object Object].xmlDemo (imports/api/main.js:6:21) 
I20160620-17:41:11.834(-4)?  at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1704:12) 
I20160620-17:41:11.834(-4)?  at packages/ddp-server/livedata_server.js:711:19 
I20160620-17:41:11.835(-4)?  at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 
I20160620-17:41:11.835(-4)?  at packages/ddp-server/livedata_server.js:709:40 
I20160620-17:41:11.835(-4)?  at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 
I20160620-17:41:11.835(-4)?  at packages/ddp-server/livedata_server.js:707:46 
I20160620-17:41:11.836(-4)?  at tryCallTwo (/Users/melkisespinal/.meteor/packages/promise/.0.7.2.71gs7j++os+web.browser+web.cordova/npm/node_modules/promise/lib/core.js:45:5) 
I20160620-17:41:11.836(-4)?  - - - - - 
I20160620-17:41:11.836(-4)?  at Socket.socketOnData (http.js:1639:20) 
I20160620-17:41:11.837(-4)?  at TCP.onread (net.js:528:27) 

ich das Problem mit meinen Fakultätsberatern besprach, und er hatte die Das gleiche Problem in Java mit HTTP Request. Er benutzte Firefox 'Web Developer' Tool und sah die eingehenden und ausgehenden Dateien des Netzwerks. Die Hauptwebseite hat einen Statuscode von 200 zurückgegeben, was gut ist, aber der mit dem XML hatte anscheinend keine Headerdatei (also keinen Statuscode). Wir sagten, dass dies vielleicht das Problem sei. Also versuchte er stattdessen, einen Socket zu verwenden, und dann verwendete er eine 'GET'-Anfrage auf einem PrintWriter unter Verwendung des InputStreams des Sockets und es funktionierte perfekt. Er hat das XML zurückbekommen. Jetzt weiß ich nicht, ob Socket-Programmierung in Meteor (serverseitig)/JavaScript verfügbar ist.

Hier ist der Code ich für den HTTP-Aufruf (und nicht), die synchron für jetzt ist:

'xmlDemo':function(){ 
    var result = HTTP.call('GET', 'http://10.181.160.100/get_public_tbl.cgi?A=1', 
     {}); 
    if(result.statusCode == 200){ 
     return result.content; 
    } 
    else{ 
     console.log("Response issue: ", result.statusCode); 
     throw new Meteor.Error(result.statusCode, result.error); 
    } 
} 

Wenn ich statt dem aktuellen Link nur tun 10.181.160.100/, gibt es Daten zurück und es wird auf der Konsole ausgegeben (Daten sind nicht definiert, wenn Sie versuchen, mit dem Link der XML-Datei zu drucken).

Also ich denke, die Frage ist, ob es irgendeinen Weg gibt, wie Socket Programming mit diesem oder jedem anderen Meteor-Paket umgehen kann, das ich hinzufügen kann und vielleicht mir helfen, mit diesem Problem umzugehen. Danke im Voraus.

Update 1

Hier ist die cURL Informationen von Chrome-Netzwerk-Funktion bekommen wie gewünscht:

curl http://10.181.160.100/get_public_tbl.cgi?A=1' 
-H 'Accept-Encoding: gzip, deflate, sdch' 
-H 'Accept-Language: en-US,en;q=0.8,es;q=0.6' 
-H 'Upgrade-Insecure-Requests: 1' 
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36' 
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' 
-H 'Cache-Control: max-age=0' 
-H 'Connection: keep-alive' 
--compressed 

Auch umgeben ich den Code in einem Try und fangen und ich bekam die folgende Fehlermeldung:

TypeError: Cannot read property 'statusCode' of undefined 
I20160622-20:57:38.918(-4)?  at [object Object].xmlDemo (imports/api/main.js:27:6) 
I20160622-20:57:38.918(-4)?  at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1704:12) 
I20160622-20:57:38.918(-4)?  at packages/ddp-server/livedata_server.js:711:19 
I20160622-20:57:38.919(-4)?  at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 
I20160622-20:57:38.919(-4)?  at packages/ddp-server/livedata_server.js:709:40 
I20160622-20:57:38.919(-4)?  at [object Object]._.extend.withValue (packages/meteor/dynamics_nodejs.js:56:1) 
I20160622-20:57:38.919(-4)?  at packages/ddp-server/livedata_server.js:707:46 
I20160622-20:57:38.920(-4)?  at tryCallTwo (/Users/melkisespinal/.meteor/packages/promise/.0.7.2.71gs7j++os+web.browser+web.cordova/npm/node_modules/promise/lib/core.js:45:5) 
I20160622-20:57:38.920(-4)?  at doResolve (/Users/melkisespinal/.meteor/packages/promise/.0.7.2.71gs7j++os+web.browser+web.cordova/npm/node_modules/promise/lib/core.js:200:13) 
I20160622-20:57:38.920(-4)?  at new Promise (/Users/melkisespinal/.meteor/packages/promise/.0.7.2.71gs7j++os+web.browser+web.cordova/npm/node_modules/promise/lib/core.js:66:3) 

Antwort

0

Antwort geändert. Siehe Verlauf für vorherigen (inkorrekten) Versuch.

Versuchen Sie, Ihren Code zu ändern, dies zu tun ...

var result = HTTP.call(
     'GET', 
     'http://10.181.160.100/get_public_tbl.cgi', 
     {'query': '?A=1'}, 
     function(error, result) { 
    if(error) { 
     // Failed hideously 
    } else { 
     // Got a response 
     if(result.statusCode == 200){ 
      // Was OK 
      return result.content; 
     } else { 
      // Was something other than a 200 OK 
      console.log("Response issue: ", result.statusCode); 
      throw new Meteor.Error(result.statusCode, result.error); 
     } 
    } 
}); 
+0

Danke für die schnelle Antwort. Ich habe den Beitrag mit der Antwort aktualisiert, die ich bekommen habe. Ich hoffe, es hilft. Ich habe auch "Kopiere Antwort-Header" und ich habe das zurück: "HTTP/0.9 200 OK" und Sie erwähnt HTTP/1.1. Ich weiß nicht, ob das wichtig ist, aber da ist es sowieso. –

+0

Neuer Fehler im ursprünglichen Post gemeldet, als ich die HTTP-Anforderung in einem Versuchs- und Catch-Block umgab. –

+0

@melkis_espinal Entschuldigung, ich wurde vor kurzem in Arbeit begraben und war nicht in der Lage, noch einmal zu besuchen. Ich benutze keinen Meteor, aber das [Handbuch impliziert] (https://themeteorchef.com/snippets/using-the-http-package/#tmc-get-requests) du nennst es falsch ...Beachten Sie, dass für den Abschluss der Anforderung ein Rückrufmechanismus verwendet wird (die anonyme 'Funktion (Fehler, Antwort)' und ihr Textkörper sind beide Teil des Methodenaufrufs für HTTP, der unmittelbar danach nicht ausgeführt wird). Ihr Ansatz würde funktionieren, wenn der Anruf blockiert wäre, aber es sieht so aus, als wäre er asynchron. – Basic