nodejs http.get 응답의 본문은 어디에 있습니까?


187

http://nodejs.org/docs/v0.4.0/api/http.html#http.request 에서 문서를 읽고 있지만 어떤 이유로 실제로 body / data 속성을 찾을 수없는 것 같습니다 리턴되고 완료된 응답 오브젝트에서.

> var res = http.get({host:'www.somesite.com', path:'/'})

> res.finished
true

> res._hasBody
true

완료되었으므로 (http.get이이를 수행함) 일종의 내용이 있어야합니다. 그러나 신체와 데이터가 없으며 읽을 수 없습니다. 시체는 어디에 숨어 있습니까?


7
답변 아무도 당신이 때 알 방법을 언급하지 않기 때문에 data이벤트가 완료 ..을 당신의 res수신 "end"( nodejs.org/docs/latest/api/http.html#event_end_ )
SooDesuNe

답변:


172

http.request 문서에는 data이벤트 처리를 통해 응답 본문을 수신하는 방법에 대한 예제가 포함되어 있습니다 .

var options = {
  host: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST'
};

var req = http.request(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();

http.getreq.end()자동 호출을 제외하고 http.request와 동일한 작업을 수행합니다 .

var options = {
  host: 'www.google.com',
  port: 80,
  path: '/index.html'
};

http.get(options, function(res) {
  console.log("Got response: " + res.statusCode);

  res.on("data", function(chunk) {
    console.log("BODY: " + chunk);
  });
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

15
어떤 이유로 든 res.setEncoding('utf8');http.get 예제 에 추가 해야했습니다. 그렇지 않으면 chunk변수에 HTML을 얻지 못했습니다 .
SSH This

1
@SSH 이는 원시 데이터를 포함하는 버퍼 오브젝트이기 때문입니다. 문자열을 원한다면 chunk.toString ()을 사용하여 선택적으로 toString 및 인코딩을 전달할 수도 있습니다. 즉 setEncoding이 더 효율적일 것입니다.
skeggse

14
"데이터"이벤트가 여러 번 호출 될 수 있으며 콘텐츠를 하나씩 가져옵니다. 예제는 서로 접착하는 방법을 보여주지 않습니다.
Andrej

4
@tfmontague. 동의했다! 놀랍게도 ... 그 기초에 결함이있는 답변에 대한 많은 공감대.
Sunny

@tfmontague : POST requests typically use a response body, not GET.게시 요청 에는 본문이 있고 GET 요청 에는 없지만 GET 응답 에는 본문이있을 수 있습니다.
Cyrbil

135

또한에 http.ClientResponse의해 반환 된 이벤트 http.get()가 있음을 추가하고 싶습니다 end. 따라서 본문 응답을받는 또 다른 방법이 있습니다.

var options = {
  host: 'www.google.com',
  port: 80,
  path: '/index.html'
};

http.get(options, function(res) {
  var body = '';
  res.on('data', function(chunk) {
    body += chunk;
  });
  res.on('end', function() {
    console.log(body);
  });
}).on('error', function(e) {
  console.log("Got error: " + e.message);
}); 

13
고마워요! '종료'이벤트는 청크가 아닌 응답 본문을 전체적으로 처리해야했기 때문에 중요했습니다.
Daniel Gruszczyk 2016 년

http.ClientResponsehttp.get() http.ClientRequest현재 문서와 원본 포스터에 연결된 문서에 따라입니다.
Vince

54

편집 : 6 년 후 자신에게 회신

await를 키워드는 콜백을 피하고, HTTP 요청에서 응답을 얻을 수있는 가장 좋은 방법입니다.then()

또한 약속을 반환하는 HTTP 클라이언트를 사용해야합니다. http.get()여전히 Request 객체를 반환하므로 작동하지 않습니다. 을 사용할 수는 fetch있지만 superagent간단한 쿼리 문자열 인코딩, MIME 유형의 올바른 사용, 기본적으로 JSON 및 기타 일반적인 HTTP 클라이언트 기능을 포함하여보다 합리적인 기본값을 제공하는 성숙한 HTTP 클라이언트입니다. awaitPromise가 값을 가질 때까지 기다립니다.이 경우 HTTP 응답입니다!

const superagent = require('superagent');

(async function(){
  const response = await superagent.get('https://www.google.com')
  console.log(response.text)
})();

대기를 사용하여, 약속 이 값을 가져 오면 제어는 단순히 다음 행으로 넘어갑니다superagent.get() .


3
이것은 원래 질문에 대한 답변이 아닙니다. 예제 코드에서 ressuperagent.get()아닌 의 반환 값으로 설정되어 http.get()있습니다. 속성 이 http.get()없는를 반환합니다 . 응답 객체가 아니라 요청 객체입니다. http.IncomingMessagetext
Vince

좋은 지적 Vince 저는 약속을 지원하는 HTTP 클라이언트를 사용하고 있습니다.
mikemaccana

12

data이벤트들은 다운로드로 몸의 '덩어리'와 함께 여러 번 해고 end모든 덩어리가 다운로드 한 이벤트입니다.

노드 지원 약속 을 사용하여 약속 된 부분을 통해 연결된 청크를 반환하는 간단한 래퍼를 만들었습니다.

const httpGet = url => {
  return new Promise((resolve, reject) => {
    http.get(url, res => {
      res.setEncoding('utf8');
      let body = ''; 
      res.on('data', chunk => body += chunk);
      res.on('end', () => resolve(body));
    }).on('error', reject);
  });
};

다음을 사용하여 비동기 함수에서 호출 할 수 있습니다.

const body = await httpGet('http://www.somesite.com');

11

.get을 사용하려면 다음과 같이하십시오.

http.get(url, function(res){
    res.setEncoding('utf8');
    res.on('data', function(chunk){
        console.log(chunk);
    });

});

2
다른 예제는 청크 응답과 함께 텍스트를 포함하지 않았을 때 16 진수 값처럼 보였습니다. 인코딩을 설정하면 내가 찾던 JSON 문서가 표시되었습니다. 감사합니다!
Collin McGuire

@CollinMcGuire는 원시 데이터를 포함하는 Buffer 객체이기 때문입니다. 문자열을 원한다면 chunk.toString(), 선택적으로 전달 toString및 인코딩을 사용할 수도 있습니다 . 즉, setEncoding더 효율적일 것입니다.
skeggse

6

node.js는 다음과 같이 비동기식으로 작동하기 때문에 요청에 리스너를 추가해야합니다.

request.on('response', function (response) {
  response.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
 });
});

2

바늘 모듈도 좋습니다. 여기에 needle모듈 을 사용하는 예가 있습니다.

var needle = require('needle');

needle.get('http://www.google.com', function(error, response) {
  if (!error && response.statusCode == 200)
    console.log(response.body);
});

0

커피의 일부 :

# My little helper
read_buffer = (buffer, callback) ->
  data = ''
  buffer.on 'readable', -> data += buffer.read().toString()
  buffer.on 'end', -> callback data

# So request looks like
http.get 'http://i.want.some/stuff', (res) ->
  read_buffer res, (response) ->
    # Do some things with your response
    # but don't do that exactly :D
    eval(CoffeeScript.compile response, bare: true)

그리고 컴파일

var read_buffer;

read_buffer = function(buffer, callback) {
  var data;
  data = '';
  buffer.on('readable', function() {
    return data += buffer.read().toString();
  });
  return buffer.on('end', function() {
    return callback(data);
  });
};

http.get('http://i.want.some/stuff', function(res) {
  return read_buffer(res, function(response) {
    return eval(CoffeeScript.compile(response, {
      bare: true
    }));
  });
});

0

의 반환 값에서 응답 본문을 가져올 수 없습니다 http.get().

http.get()응답 객체를 반환하지 않습니다. 요청 객체 ( http.clientRequest)를 반환합니다 . 따라서의 반환 값에서 응답 본문을 얻는 방법은 없습니다 http.get().

나는 그것이 오래된 질문이라는 것을 알고 있지만, 당신이 링크 한 문서를 읽으면 게시했을 때조차도 이것이 사실임을 알 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.