node.js
  • http
  • character-encoding
  • request
  • bing
  • 2013-02-22 4 views 7 likes 
    7

    Bing 검색 API에서 데이터를 가져 오려고하고 있으며 기존 라이브러리가 오래되어 단종 된 API를 기반으로 한 것 같기 때문에 request 라이브러리를 사용하여 직접 해보 았지만, 이를위한 가장 보편적 인 라이브러리 인 것으로 보입니다. 내 코드가node.js "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) 
    

    처럼 보이는 빙 일부 JSON을 반환하고 응답 본문이 문자열이 잘못되었습니다 불평 JSON.parse 비 ASCII 문자를 대량으로 포함되어있는 경우 나는 때로는 하지만 작업 할 수 있습니다. ATOM 콘텐츠 유형으로 전환하려고 시도했지만 차이가 없었습니다. xml이 유효하지 않습니다. request() 콜백에서 사용할 수있는 응답 본문을 검사하면 실제로 잘못된 코드가 표시됩니다.

    그래서 나는 파이썬 코드로 같은 요청을 시도했다. 그리고 그것은 항상 잘 작동하는 것처럼 보인다. 참고 :

    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 데이터가 무효화됩니다. 이는 큰 응답에서는 발생하지만 작은 응답에서는 발생하지 않습니다. 뭔가 내가 일을해야하다 (어딘가 인코딩을 설정? 빙은 UTF-8 반환, 그래서이 필요 보이지 않는) 경우 노드에 새가되는

    , 나는 확실하지 않다.

    누구나 무슨 일이 일어나고 있는지 알 수 있습니까?

    FWIW, OSX 10.8이고, 노드는 macports를 통해 설치된 v0.8.20이고 요청은 npm을 통해 v2.14.0이 설치됩니다.

    답변

    1

    요청 라이브러리에 대해서는 확실하지 않지만 기본 nodejs는 잘 작동합니다. 또한 라이브러리보다 읽기가 훨씬 쉬워 보이며 실제로 다시 청크로 돌아옵니다.

    http://nodejs.org/api/http.html#http_http_request_options_callback 또는 (당신의 REQ 같은) HTTPS에 대한

    http://nodejs.org/api/https.html#https_https_request_options_callback

    옵션의 경우 약간의 팁 (정말하지만 동일) : 사용 URL이 분명히 PARAMS

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

    을 구문 분석 데이터 당신이 할 필요가 보내고 싶습니다

    +0

    TBH의 JSON 구문 분석을 가능하게도를 하지만 제대로 작동하지 않을 수 있습니다. 뭔가 잘못 됐음에 틀림 없습니다. 어쨌든 이제는 제대로 작동하는 것처럼 보이므로 다른 누군가가'request' 모듈을 사용하기위한 수정을 제공하지 않으면 여러분의 대답을 받아 들일 것입니다. 감사! – riffraff

    +1

    사실 JSON이 실제로 잘못되었다는 사실과 관련이있을 수 있습니다. 멀티 바이트 문자가있는 문자열이 있고'Content-Length'를'params.length'로 전달하면 내용의 길이가 문자열의 문자 수와 같다고 말하는 것입니다. 이것은 멀티 바이트 문자에는 해당되지 않습니다. '{ "name": "feee"}'대신에 API가 아마도'{ "name": "feee"' – amsross

    0

    요청 인증이 잘못되었다고 생각합니다. request.get 전에 인증이 제공되어야합니다. request HTTP authentication에 대한 문서를 참조하십시오. qs은 url 및 auth처럼 request options에 전달되어야하는 객체입니다. 두 번째 요청에도 동일한 req을 사용하고 있습니다. request.get은 주어진 URL의 GET에 대한 스트림을 리턴한다는 것을 알아야합니다. req을 사용하는 다음 요청이 잘못 될 것입니다. 당신은 단지 HTTPBasicAuth 필요한 경우

    , 이것은 또한 콜백 인수가 3 개 인수를 얻을 수

    //remove req = request.get and subsequent request 
    request.get('http://some.server.com/', { 
        'auth': { 
        'user': 'username', 
        'pass': 'password', 
        'sendImmediately': false 
        } 
    },function (error, response, body) { 
    }); 
    

    작동합니다. 첫 번째는 적용 가능한 경우 오류입니다 (일반적으로 http.ClientRequest 객체가 아닌 http.Client 옵션에서 발생). 두 번째는 http.ClientResponse 객체입니다. 세 번째는 응답 본문 String 또는 Buffer입니다. 두 번째 개체는 응답 스트림입니다. 그것을 사용하려면 '데이터', '끝', '오류'및 '닫기'이벤트를 사용해야합니다.

    인수를 올바르게 사용하십시오.

    +0

    이 아닙니다. 유창한 문법으로 옵션이 올바르게 설정되어 있습니다. 내 문제는 인증 아니에요, 나는 그것이 작동하고 난 인증 응답을 볼 수 있습니다. 내 문제는 맹 글링 된 응답 본문입니다. – riffraff

    0

    당신은 옵션 {JSON : 사실}를 통과해야 (https.get` 오히려`보다는`사용하지만 .request`) 나는 이런 식으로하려고 노력했다 응답

    +0

    문제는 ATOM으로 시도한 질문을 읽는다면 형식이 아닌 인코딩입니다. 그러나 문제는 18 개월 된 것이므로 잘하면 그들이 그것을 고쳤다. – riffraff

    관련 문제