2014-07-02 51 views
2

我試圖使用必應搜索API來返回一個JSON字符串。我第一次使用下面的網址按Azure的探索網站(https://datamarket.azure.com/dataset/explore/5BA839F1-12CE-4CCE-BF57-A49D98D29A44)嘗試:node.js http和bing搜索API

'https://api.datamarket.azure.com/Bing/Search/v1/Composite?Sources=%27web%27&Query=%27NGI%20SPA%27&Market=%27en-US%27' 

後,我發現了一個SO線程Using the new Bing API (nodejs)其中建議我用以下形式的網址:

https://user:<YourDefaultAccountKey>@api.datamarket.azure.com/Bing/SearchWeb/Web?Query=%27leo%20fender%27&Market=%27en-US%27&$top=50&$format=JSON 

兩者的這些返回狀態401(身份驗證失敗):

STATUS: 401 
HEADERS: {"content-type":"application/json; charset=utf-8","server":"Microsoft-IIS/8.0","jsonerror":"true","x-powered-by":"ASP.NET","access-control-allow-origin":"*","access-control-allow-credentials":"false","access-control-allow-headers":"Authorization, DataServiceVersion, MaxDataServiceVersion","access-control-expose-headers":"DataServiceVersion, MaxDataServiceVersion","access-control-allow-methods":"GET, POST, OPTIONS","access-control-max-age":"604800","date":"Wed, 02 Jul 2014 17:23:29 GMT","content-length":"91"} 
BODY: {"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""} 

我也嘗試過其他各種URL組合,無濟於事。我的代碼如下:

var url = require('url'); 
var http = require('http'); 

var serviceRootURL = 'https://api.datamarket.azure.com/Bing/Search/v1/Composite?Sources=%27web%27&Query=%27NGI%20SPA%27&Market=%27en-US%27' 
var params = 'hi'; 

var dataURL = url.parse(serviceRootURL); 

var post_options = { 
    hostname: dataURL.hostname, 
    port: dataURL.port || 80, 
    path: dataURL.path, 
    method: 'GET', 
    headers: { 
     'Content-Type': 'application/json; charset=utf-8', 
     'Content-Length': params.length 
    } 
}; 

var req = http.request(post_options, function(res) { 
    console.log('STATUS: ' + res.statusCode); 
    console.log('HEADERS: ' + JSON.stringify(res.headers)); 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 

     console.log('BODY: ' + chunk); 

    }); 

}); 

req.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
}); 

// write data to request body 
req.write('data\n'); 
req.write('data\n'); 
req.end(); 

任何想法爲什麼我得到認證失敗?

回答

0

得到它與要求的工作...怪異

var request = require('request'); 
var _ = require('underscore'); 

var searchURL = 'https://user:<TIPE YOUR KEE HEER>@api.datamarket.azure.com/Bing/SearchWeb/v1/Web?Query=%27xbox%27&$top=10&$format=JSON'; 
var http = request(searchURL, function(err, resp, body) 
{ 
    if (err) 
    { 
     throw err; 
    } 
    var a = JSON.parse(body); 
    console.log(a.d.results); 
}); 
1

您可以使用this module封裝的要求,所以你可以使用它 喜歡:

var Bing = require('node-bing-api')({ accKey: "your-account-key" }); 

Bing.web("leo fender", function(error, res, body){ 
    console.log(body); 
    }, 
    { 
    top: 50, 
    market: 'en-US' 
    }); 

它的工作原理與Azure的版本。您只需更換您的賬戶密鑰。

+0

是否有前端模塊而不是節點? –

+2

我不建議從前端使用它,因爲您需要將訪問密鑰也放在前端,這意味着安全問題。如果你仍然想這樣做,我想你可以使用browserify,但我從來沒有嘗試過。 –

0

您可以使用jsearch模塊。安裝;

npm install jsearch 

usage;

js.bing('queryStringYouWant',10,function(response){ 
    console.log(response) // for Bing results 
})