2017-04-16 6 views
0

Ich bin ein Anfänger mit nodeJS.Aufruf einer POST API von Knoten JS

Was ich bin versucht:

ich eine POST-API haben gehostet und wenn ich es Postbote mit nennen, es gibt mir die richtige Antwort, wie unten in der Abbildung dargestellt:

enter image description here

Aber wenn ich versuche, es zu treffen, das NodeJS Knoten-rest-Client verwenden (https://www.npmjs.com/package/node-rest-client) es mir ein irrelevantes großes Objekt wie unten geben:

IncomingMessage { 
    _readableState: 
    ReadableState { 
    objectMode: false, 
    highWaterMark: 16384, 
    buffer: BufferList { head: null, tail: null, length: 0 }, 
    length: 0, 
    pipes: null, 
    pipesCount: 0, 
    flowing: true, 
    ended: true, 
    endEmitted: true, 
    reading: false, 
    sync: true, 
    needReadable: false, 
    emittedReadable: false, 
    readableListening: false, 
    resumeScheduled: false, 
    defaultEncoding: 'utf8', 
    ranOut: false, 
    awaitDrain: 0, 
    readingMore: false, 
    decoder: null, 
    encoding: null }, 
    readable: false, 
    domain: null, 
    _events: 
    { end: [ [Function: responseOnEnd], [Function] ], 
    data: [Function], 
    error: [Function] }, 
    _eventsCount: 3, 
    _maxListeners: undefined, 
    socket: 
    Socket { 
    connecting: false, 
    _hadError: false, 
    _handle: null, 
    _parent: null, 
    _host: null, 
    _readableState: 
     ReadableState { 
     objectMode: false, 
     highWaterMark: 16384, 
     buffer: [Object], 
     length: 0, 
     pipes: null, 
     pipesCount: 0, 
     flowing: true, 
     ended: false, 
     endEmitted: false, 
     reading: true, 
     sync: false, 
     needReadable: true, 
     emittedReadable: false, 
     readableListening: false, 
     resumeScheduled: false, 
     defaultEncoding: 'utf8', 
     ranOut: false, 
     awaitDrain: 0, 
     readingMore: false, 

Ich brauche Hilfe, um mein richtiges Objekt zu bekommen, und ich bin nicht in der Lage herauszufinden, was ich hier falsch mache.

Unten ist mein Code REST API aufrufen:

app.get('/notes', cors(), function(req, res) { 

    var args = { 
       "hiveMachineIp": "192.168.0.110", 
       "hiveMachinePort": "10000", 
       "hiveUsername": "nt", 
       "hivePassword": "", 
       "hiveDatabaseName": "default", 
       "hiveTableName": "transactions_24m", 
       "hiveAggregationColumn": "customerid", 
       "hiveAggregationFunction": "HISTOGRAM", 
       "hiveAggregationHistogramBin": "5" 
      }; 

    var Client = require('node-rest-client').Client; 

    var client = new Client(); 

    client.post("http://163.47.152.170:8090/MachinfinityDataPreparation/machinfinitydataprep/hiveDataAggregation/", args, function (data, response) { 
     // parsed response body as js object 
     // console.log(data); 
     // raw response 
     console.log(response); 
    }); 

    // registering remote methods 
    client.registerMethod("postMethod", "http://163.47.152.170:8090/MachinfinityDataPreparation/machinfinitydataprep/hiveDataAggregation/", "POST"); 

    client.methods.postMethod(args, function (data, response) { 
     // parsed response body as js object 
     // console.log(data); 
     // raw response 
     console.log(response); 
    }); 

}) 
+0

Meine Vermutung wäre, dass Sie den Client irgendwie sind Dumping, nicht die Antwort von dem Server, der Client empfängt. Wenn es Ihnen nichts ausmacht, teilen Sie einen Teil Ihres Client-Codes, der für die Erstellung des Rest-Clients und der Anfrage verantwortlich ist. –

+0

Das Problem ist gelöst mit Axios, aber ich möchte immer noch wissen, was im obigen Code falsch ist. –

Antwort

0

Sie axios wie diese verwenden können.

axios.post('/user', { 
    firstName: 'Fred', 
    lastName: 'Flintstone' 
}) 
.then(function (response) { 
    console.log(response); 
}) 
.catch(function (error) { 
    console.log(error); 
}); 
+0

Das hat für mich funktioniert. Aber warum hat es früher nicht funktioniert, wenn irgendjemand es erklären kann? –

+0

@AnKarthik Weil Sie versuchen, rohe Antwortdaten zu drucken. Es enthält alle Informationen und Daten zu Ihrer Anfrage und Antwort. – Gloorx

+0

@AnKarthik Wenn Sie nur Response-Body-Daten erhalten möchten, machen Sie 'console.log (data)' auskommentieren und entfernen Sie 'console.log (response)' in Ihrem Code – Gloorx

0

In Ihrem Code, den Sie tun, um Ihre Anfrage zweimal, einmal durch client.post dann durch client.methods.postMethod Aufruf, die registriert war vorherigen. Sie sollten das eine oder andere tun, und response Variable in jedem Callback kommt vom http-Client und es ist nicht Ihre rohe JSON-Antwort. Ihre Daten wurden bereits analysiert und sie befindet sich in data Variable.

Um eine Post-Anfrage an Ihren Rest-Server zu senden, sollten Sie entweder client.post verwenden oder Ihre Methode durch client.registerMethod und dann client.methods.registeredMethodName registrieren, um eine Anfrage zu senden.

Wenn Sie benötigen die gleiche Post-Anforderung mehrmals in Ihrem Code senden dann eine Funktion definieren, die Antwort für diese Anforderung bearbeiten, zum Beispiel:

function handleResponseA(data, response) { 
    if(response.statusCode == 200){ 
     console.log(data); 
    } else { 
     switch(response.statusCode){ 
      case 404: 
       console.log("Page not found."); 
      break; 

      case 500: 
       console.log("Internal server error."); 
      break; 

      default: 
       console.log("Response status code: " + response.statusCode); 
     } 
    } 
} 

Und dann für client.post:

client.post("http://163.47.152.170:8090/MachinfinityDataPreparation/machinfinitydataprep/hiveDataAggregation/", args, handleResponseA); 
client.post("http://163.47.152.170:8090/MachinfinityDataPreparation/machinfinitydataprep/hiveDataAggregation/", args, handleResponseA); 

Und es von registrierten Verfahren zu erreichen, registrieren Methode:

client.registerMethod("postMethod", "http://163.47.152.170:8090/MachinfinityDataPreparation/machinfinitydataprep/hiveDataAggregation/", "POST"); 

Und dann registrierte Methode aufrufen:

client.methods.postMethod(args, handleResponseA); 
client.methods.postMethod(args, handleResponseA);