7

Bing 検索 API からデータを取得しようとしていますが、既存のライブラリは廃止された古い API に基づいているように見えるため、requestライブラリを使用してみますが、これは最も一般的なライブラリであると思われます。私のコードは次のようになります

var SKEY           =  "myKey...." , 
    ServiceRootURL =  'https://api.datamarket.azure.com/Bing/Search/v1/Composite';

function getBingData(query, top, skip, cb) {
    var params = {
         Sources: "'web'", 
         Query: "'"+query+"'", 
         '$format': "JSON", 
         '$top': top, '$skip': skip
       },
       req = request.get(ServiceRootURL).auth(SKEY, SKEY, false).qs(params);
    request(req, cb)
}

getBingData("bookline.hu", 50, 0, someCallbackWhichParsesTheBody)

Bing はいくつかの JSON を返し、私は時々それを操作できます、応答本文に大量の非 ASCII 文字が含まれている場合JSON.parse、文字列の形式が正しくないと文句を言います。ATOM コンテンツ タイプに切り替えてみましたが、違いはなく、xml が無効でした。コールバックで利用可能な応答本文を検査すると、request()実際には悪いコードが示されます。

だから私はいくつかのpythonコードで同じリクエストを試みましたが、それはいつもうまくいくようです. 参考のため:

r = requests.get(
       'https://api.datamarket.azure.com/Bing/Search/v1/Composite?Sources=%27web%27&Query=%27sexy%20cosplay%20girls%27&$format=json', 
        auth=HTTPBasicAuth(SKEY,SKEY))
stuffWithResponse(r.json())

より小さな応答 (結果の数を制限するなど) では問題を再現できず、(オフセットをステップアップすることによって) 問題の原因となる単一の結果を特定することもできません。私の印象では、応答がチャンクで読み取られ、何らかの方法でトランスコードされ、悪い方法で再構築されます。つまり、マルチバイト文字が分割されると、json/atom データが無効になります。これは、大きな応答では発生しますが、小さな応答では発生しません。

ノードを初めて使用するので、何かすべきことがあるかどうかわかりません (エンコーディングをどこかに設定しますか? Bing は UTF-8 を返すので、これは必要ないようです)。

誰が何が起こっているのか知っていますか?

FWIW、私はOSX 10.8を使用しています。ノードはmacports経由でインストールされたv0.8.20であり、リクエストはnpm経由でインストールされたv2.14.0です。

4

3 に答える 3

1

リクエストライブラリについてはわかりませんが、デフォルトのnodejsライブラリはうまく機能します。また、ライブラリよりもはるかに読みやすいようで、実際にチャンクで戻ってきます。

http://nodejs.org/api/http.html#http_http_request_options_callback または https の場合 (req のように) http://nodejs.org/api/https.html#https_https_request_options_callback (実際には同じ)

オプションについては、ちょっとしたヒント: url parse を使用してください

var url = require('url');

var params = '{}'

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  
    }  
};

明らかに params は送信したいデータである必要があります

于 2013-02-22T14:44:47.837 に答える