2016-09-02 1 views
2
var express = require('express'); 
var app = express(); 

var PORT = process.env.PORT; 

app.get('/', function(req, res){ 
    res.json('Enter your query parameters for an image search like so: https://api.cognitive.microsoft.com/bing/v5.0/images/search?q=cats&count=10 and for the latest search results enter the url ttps://api.cognitive.microsoft.com/bing/v5.0/images/*'); 
}); 

Hier ist die app.get Methode, wo ich will vom Benutzer eingegebenen Parameter erhalten und es dann an den bing api umleiten um die Suchergebnisse für eine Bildsuche zurück. Die große API benötigt einen API-Schlüssel, der an den Header übergeben wird, so wie Ocp-Apim-Subscription-Key: ••••••••••••••••••••••••• ••••••. Wie mache ich das?Wie übergebe ich eine req.setHeaders-Methode für die res.redirect-Methode innerhalb derselben app.get-Funktion?

app.get('/imagesearch/:image*', function(req, res){ 
    console.log(req.params.image); 
    console.log(req.query.count); 
    res.redirect('https://api.cognitive.microsoft.com/bing/v5.0/images/search?q='+req.params.image+'&count='+req.query.count); 
}); 

app.listen(PORT, function(){ 
    console.log('Express listening on: '+PORT); 
}); 
+0

Sie können eine Kopfzeile auf diese Weise nicht festlegen. Die Weiterleitung weist den Browser an, zu einer bestimmten URL zu gehen. Der Browser wird seine eigenen Header setzen, wenn er zu dieser URL geht. Sie können diese Header nicht steuern. Also, was Sie verlangen, ist ein Nichtstarter. Kann es nicht tun. Sie müssen erreichen, was auch immer Sie versuchen, einen anderen Weg zu erreichen. Außerdem glaube ich nicht, dass Sie Ihren Abonnementschlüssel an einen Browser weitergeben möchten, der Sie auch fragt. – jfriend00

+0

Möchten Sie wirklich eine Weiterleitung oder möchten Sie einfach den Inhalt unter dieser URL abrufen und dann als Antwort auf die aktuelle Anfrage an den Browser zurücksenden. Wenn Sie dies tun, können Sie den gewünschten Header festlegen, wenn Sie den Inhalt von node.js angefordert haben, und dann können Sie die Antwort zurückleiten. Sie würden im Wesentlichen als Proxy für dieses eine Ergebnis fungieren. – jfriend00

+0

@ jfriend00 - Ja, ich möchte nur den Inhalt von der Weiterleitungs-URL zu meiner Seite greifen, im Wesentlichen nur die Daten durchleiten, ja. Wie mache ich das? –

Antwort

3

es nun Da klingt wie Sie nur die Daten von dem entfernten Standort holen möchten und senden Sie es dann als Antwort auf die ursprüngliche Anforderung, können Sie tun, dass die request module durch die Verwendung und dann die Antwort kochend davon als Ihre Antwort auf die ursprüngliche http-Anfrage.

const request = require('request'); 

app.get('/imagesearch/:image*', function(req, res){ 
    let options = { 
     url: 'https://api.cognitive.microsoft.com/bing/v5.0/images/search?q='+req.params.image+'&count='+req.query.count, 
     headers: {"Ocp-Apim-Subscription-Key": "xxxxx"} 
    }; 
    request(options).pipe(res); 
}); 
+0

Nur eine kurze Frage, kann ich dies auch tun, indem Sie eine fs.createReadStream auf der Bing API URL und dann leiten diese Antwort zurück auf die GET-Anfrage? –

+0

@ZaidHumayun - Nicht direkt. 'fs.createReadStream()' weiß nicht, wie man den Inhalt einer URL bekommt. Dafür ist die 'request()' Bibliothek zuständig. Es weiß, wie man den Inhalt einer URL in einen Lesestream umwandelt, benutzerdefinierte Header auf die Anfrage setzt, Fehler behandelt, etc ... Die 'request()' Bibliothek erstellt den Lesefluss für Sie und stellt den Inhalt von die gewünschte URL in diesen Lesestream. Sie könnten Ihren eigenen Code schreiben, um das zu tun, aber warum? Die Anfrage-Bibliothek ist bereits gut geschrieben, gut getestet Code, um das zu tun. – jfriend00

+0

Okay, ich habe eine andere schnelle Frage in diesem Fall. Wenn ich die Antwort, die von der Request-Methode empfangen wurde, filtern soll, bevor ich sie an meine Hauptresultate zurückgebe, weiß ich, dass ich die Unterstrich-Bibliothek dafür verwenden kann. Wie übertrage ich meine Antwort von der Anfrage in eine Variable oder eine Datei? Ich habe fs.createWriteStream (object_variable) anstelle von res als Pipe-Parameter versucht, aber das hat nicht funktioniert. –

Verwandte Themen