Node.js를 사용한 HTTP 요청 실행 후 삭제

대부분의 경우 우리는 HTTP 요청의 결과를 중요하게 생각합니다. 그러나 때로는 응답에 관한 것이 아니라 요청하는 것에 관한 것입니다. 이러한 경우 응답을 완전히 무시하여 일부 네트워크 대역폭을 절약하는 것이 현명할 수 있습니다.

어떻게 작동합니까?



HTTP 요청은 TCP 연결을 기반으로 합니다. curl google.com를 실행하면 google.com:80에 대한 TCP 연결이 열리고 대략 다음과 같이 전송됩니다.

GET / HTTP/1.1
Host: google.com
User-Agent: curl/7.64.1
Accept: */*





의미


1
요청 라인. 메서드, 위치 및 프로토콜 버전 포함

2
유일한 필수 헤더: "호스트"

3, 4
일부 헤더

5
헤더와 본문을 구분하는 빈 줄


일반적으로 서버가 다음과 같이 응답할 때까지 기다립니다.

HTTP/1.1 200 
Content-Type: text/html

<html><head> ...


그러나 응답은 우리에게 관심이 없습니다. 요청을 보낸 다음 TCP 연결을 종료하고 더 흥미로운 작업을 계속합니다.

대략적인 테스트 구현



가장 먼저 필요한 것은 호출할 수 있는 테스트 서버입니다.

const http = require("http");

http
  .createServer((req, res) => {
    req.on("end", () => {
      setTimeout(
        () => {
          console.log("Done");
          res.statusCode = 200;
          res.end("Done");
        },
        1000
      );
    });
  })
  .listen(5000);

시간이 많이 걸리는 작업을 시뮬레이트하기 위해 이 서버는 응답을 1초 지연시킵니다.

이제 흥미로운 부분인 수동 HTTP 요청 만들기입니다.

const net = require("net");

const client = new net.Socket();

client.connect(5000, "localhost", () => {
  // request line
  client.write("POST / HTTP/1.1\r\n");

  // headers
  client.write("Host: localhost:5000\r\n");
  client.write(`Content-Length: 11\r\n`);

  // blank line
  client.write("\r\n");

  // body
  client.write("Hello World");

  // end the connection prematurely
  client.destroy();
});

client.on("close", () => {
  console.log("Connection Closed");
});

오히려 간단합니다! localhost:5000에 대한 연결을 열고 요청을 발송합니다. 중요한 줄은 client.destroy() 에 대한 호출로, 요청이 전송된 직후 소켓을 종료합니다.

실제로 살펴보겠습니다.



결론



Fire-and-forget HTTP 호출은 그렇게 어렵지 않습니다. 대역폭이 제한된 환경에서 사용할 수 있습니다. 아마도 Quirrel 에 사용할 것입니다.

이 게시물이 유용하거나 흥미로웠다면 댓글을 남기거나 Twitter에 메시지를 남겨주세요! 나는 항상 다른 사람들을 돕는 내 콘텐츠에 대해 듣는 것을 좋아합니다.

좋은 웹페이지 즐겨찾기