> 웹 프론트엔드 > 프런트엔드 Q&A > nodejs http 모듈의 방법은 무엇입니까

nodejs http 모듈의 방법은 무엇입니까

青灯夜游
풀어 주다: 2022-01-25 13:57:21
원래의
2198명이 탐색했습니다.

nodejs http 모듈 메소드는 다음과 같습니다. 1. 서버 인스턴스를 생성할 수 있는 createServer(), 지정된 포트를 수신하기 위해 서버를 시작하는 listening(); ; 5. end(); 6. get(); 요청() 등

nodejs http 모듈의 방법은 무엇입니까

이 튜토리얼의 운영 환경: windows7 시스템, nodejs 버전 12.19.0, DELL G3 컴퓨터.

http 모듈

1 기본 사용법

1.1 모듈 속성

1.1.1 HTTP 요청 속성

  • 헤더: HTTP 요청의 헤더 정보입니다. headers:HTTP请求的头信息。

  • url:请求的路径。

1.2 模块方法

1.2.1 http模块的方法

createServer(callback):创造服务器实例。

1.2.2 服务器实例的方法

listen(port):启动服务器监听指定端口。

1.2.3 HTTP回应的方法

  • setHeader(key, value):指定HTTP头信息。

  • write(str):指定HTTP回应的内容。

  • end():发送HTTP回应。

1.3 处理GET请求

Http模块主要用于搭建HTTP服务。使用Node.js搭建HTTP服务器非常简单。

var http = require('http');

http.createServer(function (request, response){
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8080, "127.0.0.1");

console.log('Server running on port 8080.');
로그인 후 복사
  • 上面代码第一行var http = require("http"),表示加载http模块
  • 然后,调用http模块的createServer方法,创造一个服务器实例,将它赋给变量http。
  • ceateServer方法接受一个函数作为参数,该函数的request参数是一个对象,表示客户端的HTTP请求
  • response参数也是一个对象,表示服务器端的HTTP回应。response.writeHead方法表示,服务器端回应一个HTTP头信息;response.end方法表示,服务器端回应的具体内容,以及回应完成后关闭本次对话
  • 最后的listen(8080)表示启动服务器实例,监听本机的8080端口
    将上面这几行代码保存成文件app.js,然后用node调用这个文件,服务器就开始运行了。
$ node app.js
로그인 후 복사

这时命令行窗口将显示一行提示“Server running at port 8080.”。打开浏览器,访问http://localhost:8080,网页显示“Hello world!”
上面的例子是当场生成网页,也可以事前写好网页,存在文件中,然后利用fs模块读取网页文件,将其返回。

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

http.createServer(function (request, response){
  fs.readFile('data.txt', function readData(err, data) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end(data);
  });
}).listen(8080, "127.0.0.1");

console.log('Server running on port 8080.');
로그인 후 복사

下面的修改则是根据不同网址的请求,显示不同的内容,已经相当于做出一个网站的雏形了。

var http = require("http");
http.createServer(function(req, res) {
  // 主页
  if (req.url == "/") {
    res.writeHead(200, { "Content-Type": "text/html" });
    res.end("Welcome to the homepage!");
  }
	// About页面
  else if (req.url == "/about") {
    res.writeHead(200, { "Content-Type": "text/html" });
    res.end("Welcome to the about page!");
  }
  // 404错误
  else {
    res.writeHead(404, { "Content-Type": "text/plain" });
    res.end("404 error! File not found.");
  }
}).listen(8080, "localhost");
로그인 후 복사

回调函数的req(request)对象,拥有以下属性。

  • url:发出请求的网址
  • method:HTTP请求的方法
  • headers:HTTP请求的所有HTTP头信息。

1.4 处理POST请求

当客户端采用POST方法发送数据时,服务器端可以对dataend两个事件,设立监听函数。

var http = require('http');

http.createServer(function (req, res) {
  var content = "";

  req.on('data', function (chunk) {
    content += chunk;
  });

  req.on('end', function () {
    res.writeHead(200, {"Content-Type": "text/plain"});
    res.write("You've sent: " + content);
    res.end();
  });

}).listen(8080);
로그인 후 복사

data事件会在数据接收过程中,每收到一段数据就触发一次,接收到的数据被传入回调函数。end事件则是在所有数据接收完成后触发。
对上面代码稍加修改,就可以做出文件上传的功能。

"use strict";

var http = require('http');
var fs = require('fs');
var destinationFile, fileSize, uploadedBytes;

http.createServer(function (request, response) {
  response.writeHead(200);
  destinationFile = fs.createWriteStream("destination.md");
  request.pipe(destinationFile);
  fileSize = request.headers['content-length'];
  uploadedBytes = 0;

  request.on('data', function (d) {
    uploadedBytes += d.length;
    var p = (uploadedBytes / fileSize) * 100;
    response.write("Uploading " + parseInt(p, 0) + " %\n");
  });

  request.on('end', function () {
    response.end("File Upload Complete");
  });
}).listen(3030, function () {
  console.log("server started");
});
로그인 후 복사

2 发出请求

2.1 get()

get方法用于发出get请求。

function getTestPersonaLoginCredentials(callback) {
  return http.get({
    host: 'personatestuser.org',
    path: '/email'
  }, function(response) {
    var body = '';

    response.on('data', function(d) {
      body += d;
    });

    response.on('end', function() {
      var parsed = JSON.parse(body);
      callback({
        email: parsed.email,
        password: parsed.pass
      });
    });
  });
},
로그인 후 복사

2.2 request()

request方法用于发出HTTP请求,它的使用格式如下。

http.request(options[, callback])
로그인 후 복사

request方法的options参数,可以是一个对象,也可以是一个字符串。如果是字符串,就表示这是一个URL,Node内部就会自动调用url.parse(),处理这个参数。
options对象

🎜url: 요청된 경로입니다. 🎜🎜🎜1.2 모듈 메소드 🎜🎜🎜1.2.1 http 모듈 메소드 🎜🎜createServer(callback): 서버 인스턴스를 생성합니다. 🎜🎜1.2.2 서버 인스턴스 방법🎜🎜listen(port): 지정된 포트를 수신하기 위해 서버를 시작합니다. 🎜🎜1.2.3 HTTP 응답 방법🎜🎜🎜🎜setHeader(key, value): HTTP 헤더 정보를 지정합니다. 🎜🎜🎜write(str): HTTP 응답의 내용을 지정합니다. 🎜🎜🎜end(): HTTP 응답을 보냅니다. 🎜🎜🎜1.3 GET 요청 처리🎜🎜🎜Http 모듈은 주로 HTTP 서비스를 구축하는 데 사용됩니다. Node.js를 사용하여 HTTP 서버를 구축하는 것은 매우 간단합니다. 🎜
var postData = querystring.stringify({
  'msg' : 'Hello World!'
});

var options = {
  hostname: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': postData.length
  }
};

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(postData);
req.end();
로그인 후 복사
로그인 후 복사
    🎜위 코드의 첫 번째 줄 var http = require("http")는 http 모듈을 로드한다는 뜻입니다.🎜그런 다음, createServer 메서드를 호출하세요. http 모듈 code>, 서버 인스턴스를 생성하고 이를 http 변수에 할당합니다. 🎜ceateServer 메소드는 함수를 매개변수로 받아들입니다. 함수의 요청 매개변수는 클라이언트의 HTTP 요청을 나타내는 개체입니다.🎜The 응답 매개변수는 서버측 HTTP 응답을 나타내는 객체이기도 합니다. response.writeHead 메소드는 서버가 HTTP 헤더로 응답함을 나타내고, response.end 메소드는 서버 응답의 특정 내용을 나타내고 이 페이지를 닫습니다. 대화가 완료된 후🎜마지막 listen(8080)은 서버 인스턴스를 시작하고 로컬 컴퓨터의 8080 포트<를 수신하는 것을 의미합니다. br/> 코드 줄을 app.js 파일에 저장한 다음 node를 사용하여 이 파일을 호출하면 서버가 실행되기 시작합니다.
openssl genrsa -out key.pem
openssl req -new -key key.pem -out csr.pem
openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem
rm csr.pem
로그인 후 복사
로그인 후 복사
🎜이때 명령줄 창에는 "서버가 포트 8080에서 실행 중입니다."라는 줄 프롬프트가 표시됩니다. 브라우저를 열고 http://localhost:8080을 방문하세요. 웹페이지에 “Hello world!”가 표시됩니다.
위의 예는 웹페이지를 즉석에서 생성하거나, 미리 웹페이지를 작성하여 파일로 저장한 뒤 fs 모듈을 이용하여 웹페이지 파일을 읽어서 반환하는 방법입니다. 🎜
var https = require(&#39;https&#39;);
var fs = require(&#39;fs&#39;);
var options = {
  key: fs.readFileSync(&#39;key.pem&#39;),
  cert: fs.readFileSync(&#39;cert.pem&#39;)
};

var a = https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);
로그인 후 복사
로그인 후 복사
🎜다음 수정 사항은 다양한 URL의 요청에 따라 다른 콘텐츠를 표시하는 것으로, 이는 웹 사이트의 프로토타입을 만드는 것과 같습니다. 🎜
curl -k https://localhost:8000
로그인 후 복사
로그인 후 복사
🎜콜백 함수의 req(요청) 객체에는 다음과 같은 속성이 있습니다. 🎜
    🎜url: 요청의 URL🎜method: HTTP 요청 방법🎜headers: 모두 HTTP 요청에 대한 HTTP 헤더 정보입니다.
🎜🎜1.4 POST 요청 처리🎜🎜🎜클라이언트가 POST 메서드를 사용하여 데이터를 보낼 때 서버는 data를 처리할 수 있습니다. > end두 개의 이벤트, 청취 기능을 설정합니다. 🎜rrreee🎜data 이벤트는 데이터 수신 과정에서 데이터가 수신될 때마다 발생하며, 수신된 데이터는 콜백 함수로 전달됩니다. 모든 데이터 수신이 완료된 후 end 이벤트가 발생합니다.
위 코드를 살짝 수정하면 파일 업로드 기능을 만들 수 있습니다. 🎜rrreee🎜🎜🎜2 요청하기🎜🎜🎜🎜🎜2.1 get()🎜🎜🎜get 메소드는 가져오기 요청을 하는 데 사용됩니다. 🎜rrreee🎜🎜2.2 request()🎜
🎜🎜요청 메소드HTTP 요청을 발행하는 데 사용되며, 사용 형식은 다음과 같습니다. 🎜rrreee🎜요청 메소드의 옵션 매개변수는 객체 또는 문자열일 수 있습니다. 문자열이면 URL이라는 뜻이고 Node는 자동으로 내부적으로 url.parse()를 호출해 이 매개변수를 처리합니다.
옵션 개체는 다음 속성을 설정할 수 있습니다🎜
  • host:HTTP请求所发往的域名或者IP地址,默认是localhost
  • hostname:该属性会被url.parse()解析,优先级高于host。
  • port:远程服务器的端口,默认是80。
  • localAddress:本地网络接口。
  • socketPath:Unix网络套接字,格式为host:port或者socketPath。
  • method:指定HTTP请求的方法,格式为字符串,默认为GET。
  • path:指定HTTP请求的路径,默认为根路径(/)。可以在这个属性里面,指定查询字符串,比如/index.html?page=12。如果这个属性里面包含非法字符(比如空格),就会抛出一个错误。
  • headers:一个对象,包含了HTTP请求的头信息。
  • auth:一个代表HTTP基本认证的字符串user:password。
  • agent:控制缓存行为,如果HTTP请求使用了agent,则HTTP请求默认为Connection: keep-alive,它的可能值如下:
    • undefined(默认):对当前host和port,使用全局Agent。
    • Agent:一个对象,会传入agent属性。
    • false:不缓存连接,默认HTTP请求为Connection: close。
  • keepAlive:一个布尔值,表示是否保留socket供未来其他请求使用,默认等于false。
  • keepAliveMsecs:一个整数,当使用KeepAlive的时候,设置多久发送一个TCP KeepAlive包,使得连接不要被关闭。默认等于1000,只有keepAlive设为true的时候,该设置才有意义。
    request方法的callback参数是可选的,在response事件发生时触发,而且只触发一次。
    http.request()返回一个http.ClientRequest类的实例。它是一个可写数据流,如果你想通过POST方法发送一个文件,可以将文件写入这个ClientRequest对象
    下面是发送POST请求的一个例子。
var postData = querystring.stringify({
  &#39;msg&#39; : &#39;Hello World!&#39;
});

var options = {
  hostname: &#39;www.google.com&#39;,
  port: 80,
  path: &#39;/upload&#39;,
  method: &#39;POST&#39;,
  headers: {
    &#39;Content-Type&#39;: &#39;application/x-www-form-urlencoded&#39;,
    &#39;Content-Length&#39;: postData.length
  }
};

var req = http.request(options, function(res) {
  console.log(&#39;STATUS: &#39; + res.statusCode);
  console.log(&#39;HEADERS: &#39; + JSON.stringify(res.headers));
  res.setEncoding(&#39;utf8&#39;);
  res.on(&#39;data&#39;, function (chunk) {
    console.log(&#39;BODY: &#39; + chunk);
  });
});

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

// write data to request body
req.write(postData);
req.end();
로그인 후 복사
로그인 후 복사

注意,上面代码中,req.end()必须被调用,即使没有在请求体内写入任何数据,也必须调用。因为这表示已经完成HTTP请求
发送过程的任何错误(DNS错误、TCP错误、HTTP解析错误),都会在request对象上触发error事件

3 搭建HTTPs服务器

搭建HTTPs服务器需要有SSL证书。对于向公众提供服务的网站,SSL证书需要向证书颁发机构购买;对于自用的网站,可以自制。
自制SSL证书需要OpenSSL,具体命令如下。

openssl genrsa -out key.pem
openssl req -new -key key.pem -out csr.pem
openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem
rm csr.pem
로그인 후 복사
로그인 후 복사

上面的命令生成两个文件:ert.pem(证书文件)key.pem(私钥文件)。有了这两个文件,就可以运行HTTPs服务器了。
Node.js提供一个https模块,专门用于处理加密访问。

var https = require(&#39;https&#39;);
var fs = require(&#39;fs&#39;);
var options = {
  key: fs.readFileSync(&#39;key.pem&#39;),
  cert: fs.readFileSync(&#39;cert.pem&#39;)
};

var a = https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);
로그인 후 복사
로그인 후 복사

上面代码显示,HTTPs服务器与HTTP服务器的最大区别,就是createServer方法多了一个options参数。运行以后,就可以测试是否能够正常访问。

curl -k https://localhost:8000
로그인 후 복사
로그인 후 복사

更多node相关知识,请访问:nodejs 教程

위 내용은 nodejs http 모듈의 방법은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿