Node.js HTTP(S) module // 初级爬虫, 搭建web server,调用本地文件, 处理JSON文件 (全方面概括!!)

HTTP(S) module全方面概括

Author: Cvanzy

Table of Contents

HTTP(S) module全方面概括

简介

1.发送请求

应用:

Advanced 提高:

知识结合

2.搭建 Web Server:

什么是web service

搭建

测试运行

响应HTML 

结果

3. 调用文件

拆分讲解

导入包

主方程扩展:

错误

完善 最终结果

结果

4. 分析JSON数据

应用

获取数据

分析数据


简介:

 

Node.js中的HTTP接口旨在支持传统上难以使用的协议的许多功能。往往来说 HTTP 传输着一些大流量的数据, 但是它可以帮忙缓冲下来 并且快速的完成结果 - 用户能够流式传输数据。

在这个文章中

我们从获取数据入手 如何获取任何一个网站的HTML文件 CCS文件 网页上的信息

接着 我们要搭建一个web server 允许用户在上面获取信息

然后 我们要优化这个web server 使他拥有功能性

最后 我们要用这个web server 处理分析JSON文件 并且运用


有俩个module涉及到HTTP, 一个是 HTTP 另外 一个是 HTTPs

你现在就可以在你的浏览器域名中 看到这个部分

现在大多数主流网站的module都是使用的HTTPs 因为它更附有安全性


 

1.发送请求

概括:

目前,我们的Web应用程序往往与其他服务进行大量集成,无论是与Twitter等REST服务交互,还是从Flickr下载图像。使用Node / JavaScript是处理这类应用程序的最流行的语言之一。无论哪种方式,您都会发出大量的HTTP请求,这意味着您需要一个可靠的模块来使编写代码更加广泛运用

应用:

const request = require('request');

request('https://www.csdn.net', function(err, res, body) {  
    console.log(body);
});

上面这段代码,会返编写 csdn.net的内容

包括HTML, JSON  等等

第一个argument在request中 可以被替换成很多不同的量, 有 <URL / Object/ String>

Advanced 提高:

因此 我们会列出一个options 去包含我们所要请求的选项, 包括

  • url: 网站
  • method: HTTPS 的方程(GET, POST, DELETE, etc)
  • headers: 一个http 的 object 被设置在 区域中
const https = require('https');

const options = {
  hostname: 'encrypted.google.com',
  port: 443,
  path: '/',
  method: 'GET'
};

然后我们便可以查看这个 网站中的信息

如下:

const req = https.request(options, (res) => {
  console.log('statusCode:', res.statusCode);
  console.log('headers:', res.headers);

  res.on('data', (d) => {
    process.stdout.write(d);
  });

  res.on('close', (d) => {
    process.stdout.write('Done!');
  });
});

req.on('error', (e) => {
  console.error(e);
});
req.end();

在这 有三个event listener 

  • function(res) 会产生当连接开始
  • on('data') 当这里有chunk of data 的时候(filesystem 提到过)
  • on('close')被called 当连接终止.  on('end') 也有相同的结果

知识结合

如果结合filesystem的知识

把所有手机的data chunk 组合在一起

然后导入一个 file

例如:

var https = require("https");
var fs = require("fs");

var options = {
	hostname: "en.wikipedia.org",
	port: 443,
	path: "/wiki/a",
	method: "GET"
};

var req = https.request(options, function(res) {

	var responseBody = "";

	console.log("Response from server started.");
	console.log(`Server Status: ${res.statusCode} `);
	console.log("Response Headers: %j", res.headers);

	res.setEncoding("UTF-8");

	res.once("data", function(chunk) {
		console.log(chunk);
	});

	res.on("data", function(chunk) {
		console.log(`--chunk-- ${chunk.length}`);
		responseBody += chunk;
	});

	res.on("end", function() {
		fs.writeFile("Charactera.html", responseBody, function(err) {
			if (err) {
				throw err;
			}
			console.log("File Downloaded");
		});
	});

});

req.on("error", function(err) {
	console.log(`problem with request: ${err.message}`);
});

req.end();

我们把 Wikipedia 的 一张直接copy进入了 a.txt 文件中

然后运行这个file在浏览器中

除了图片 其他内容 都会一一呈现出来.


2.搭建 Web Server:

build a web server


关于Node.js 的一个特征就是帮助我们搭建 webservice。 Node.js 属于 Javascript,主要针对于网络的编写

我们同样要使用到 HTTPS 这个module, 虽然 HTTP 也可以胜任这个要求 但是HTTPS 拥有 secure certification更安全

什么是web service

要想学习并深入它, 我们首先要了解它的定义

Web Services 介绍一种整合一系列 web-based的应用 包括 XML, SOAP, WSDL 和 UDDlopen standard.

  • XML 用于保存和表现数据 HTML就是一种XML
  • SOAP 用于传输数据
  • WSDL 用于确保数据可用
  • UDDI 列举可用的web services

Web服务允许组织在不了解防火墙后面的彼此IT系统的情况下进行数据通信

不同于 Client/Server,Web Server 不提供GUI 给用户 (如果不知道GUI, 我博客里面有介绍Python GUI),

Web服务通过网络上的编程接口共享业务逻辑,数据和流程。

开发人员可以将Web服务添加到GUI(例如网页或可执行程序),以向用户提供特定功能。 Web服务允许来自不同源的不同应用程序彼此通信而无需耗时的自定义编码,并且因为所有通信都是XML,所以Web服务不依赖于任何一种操作系统或编程语言。例如,Java可以与Perl交谈,Windows应用程序可以与UNIX应用程序通信。


搭建

var https = require("https");

var server = https.createServer(function(req, res) {

	res.writeHead(200, {"Content-Type": "text/plain"});

	res.end('Hello World');

});

server.listen(3000);

console.log("Server listening on port 3000");

首先 这个server 用一个 callbackfunction 每当这个server被激活的时候。

  1. 第一个返回的是request, 一个真实的object, 包括数据,header, 用户的信息, 用户的环境
  2. 第二个返回的是response, 也是一个object 是我们想要发给这个request的内容 这个需要我们来完成

                                                      因此我们用writeHead这个方程 来编辑我们的res

                                                  第一个量在writeHead是 statues code, 200表明这是一个成功的响应

                                                 第二个量代表javascript的header, 第一个将告诉浏览器你的res是什么类型 我们想要创造一个txt

      3.res.end代表关闭我们的response, 然后会返回其中的内容

      4.在最后我们要告诉服务器我们将要在哪个port使用这个server 去处理所有的 req


测试运行

1. 在termial运行文件

我们会发现 程序并没有停止运行, 它正在等待即将到来的requests

2. 在浏览器中查看

定位到 这个 port


响应HTML 

var https = require("https");

var server = https.createServer(function(req, res) {

	res.writeHead(200, {"Content-Type": "text/html"});

	res.end(`
		<!DOCTYPE html>
		<html>
			<head>
				<title>HTML Response</title>
			</head>
			<body>
				<h1>Serving HTML Text</h1>
				<p>${req.url}</p>
				<p>${req.method}</p>
			</body>
		</html>
	`);

});

server.listen(3000);

console.log("Server listening on port 3000");

把content-type更改为html

然后在end 中加入html代码 在html中 我去查看了 request的URL和 request的类型

结果

第二行是url 我们能发现我们就处于主页 所以是斜杆

如果我们尝试更改 url 例如 我们去css

我们能发现url随着我们的更改而变化 但是request的类型一直都是GET 除非我们发表了其他内容


3. 调用文件

Serving Files


在这个段落中, 主要讲述 如何 调用本地的文件在web server上

举个例子

本地 我们有html css 图片

然后我们收到了 request get 访问这些内容 我们要能顺利的将他们呈现给用户

上图中 

我们能看到在 public 这个文件夹中 包含 三个文件 一个JPD图片 一个HTML代码 一个CSS格式

我们在这就要去应用这些对象在我们的web server中

 


拆分讲解

导入包

第一步 我们会导入所需要的module http 或者 https(推荐)

然后fs 是filesystem 我们需要用它修改或者                                               

                        相关文章:https://blog.csdn.net/Cvan123/article/details/83280358

接下来path 我们需要用它得到 当前文件夹位置         

                        相关文章:https://mp.csdn.net/postedit/83099818                                

var http = require("http");
var fs = require("fs");
var path = require("path");

主方程扩展:

http.createServer(function(req, res) {

	console.log(`${req.method} request for ${req.url}`);

	if (req.url === "/") {
		fs.readFile("./public/index.html", "UTF-8", function(err, html) {
			res.writeHead(200, {"Content-Type": "text/html"});
			res.end(html);
		});

	}  else {
		res.writeHead(404, {"Content-Type": "text/plain"});
		res.end("404 File Not Found");
	}

}).listen(3000);


console.log("File server running on port 3000");

这是一个大致的框架包含处理分析

如果搜寻到当前领域不存在的文件 

会返回 404 File Not Found

readFile 以便去获得 HTML file中的所有代码  (File Stream是更好的选择 接下来会用到)

————————————

错误

但是这种code只能区分主页 和 非主页 

让我们来运行文件在 termial 中

Termial 运行 server:

打开浏览器运行

重返Termial

我们可以看到主页 在加载的同时 请求了 获取css jpg he ico 文件

——————————————————————————————————————————————

问题就来了

当我们尝试去获取css文件的时候 我们的code因为识别它不为主页

显示为404

我们可以确认它在浏览器中

——————————————————————————————————————————————

想要修复这个问题 我们需要对每个file进行识别

 


完善 最终结果

var http = require("http");
var fs = require("fs");
var path = require("path");

http.createServer(function(req, res) {

	console.log(`${req.method} request for ${req.url}`);

	if (req.url === "/") {
		fs.readFile("./public/index.html", "UTF-8", function(err, html) {
			res.writeHead(200, {"Content-Type": "text/html"});
			res.end(html);
		});

	} else if (req.url.match(/.css$/)) {

		var cssPath = path.join(__dirname, 'public', req.url);
		var fileStream = fs.createReadStream(cssPath, "UTF-8");

		res.writeHead(200, {"Content-Type": "text/css"});

		fileStream.pipe(res);

	} else if (req.url.match(/.jpg$/)) {

		var imgPath = path.join(__dirname, 'public', req.url);
		var imgStream = fs.createReadStream(imgPath);

		res.writeHead(200, {"Content-Type": "image/jpeg"});

		imgStream.pipe(res);

	} else {
		res.writeHead(404, {"Content-Type": "text/plain"});
		res.end("404 File Not Found");
	}

}).listen(3000);


console.log("File server running on port 3000");

在Else if 后面 我们首先检查 一串字符的通用表达式  后缀带有 css

res object是一个可写入的stream

fileStream.pipe(res); 

意味着filestream中读取的数据 会 自动带入res 并且自动结束

图片的请求同理去解决

结果

加载图片和主页成功以后

 


4.分析JSON数据

Serving JSON Data

 

这篇文章主要围绕如何在node js 中导入 处理JSON文件

处理和交互更多文件 请看: https://mp.csdn.net/postedit/83353163

 

我们还可以使用HTTP模块创建HTTP API,主要用于提供JSON数据的服务器。 API用于向客户端应用程序提供数据。这些应用程序通常包括移动应用程序和单页网站,但是,任何可以发出HTTP请求的客户端都可以与API通信。

应用

我们先来看一个JSON 文件格式

在这里我们能看到 大array里面 包含了一个个的 inventory的信息 

名字 编号 成本 销售价格 是否可用

我们的JS文件就将去读取这个文件 并 处理数据


获取数据

 

var http = require("https");

var data = require("./data/inventory");

http.createServer(function(req, res) {

	if (req.url === "/") {
		res.writeHead(200, {"Content-Type": "text/json"});
	    res.end(JSON.stringify(data));
	} else {
		res.writeHead(404, {"Content-Type": "text/plain"});
		res.end("Whoops... Data not found");
	}

	

}).listen(3000);

console.log("Server listening on port 3000");

在此我们用data 去储存inventory里面的JSON数据

JSON.stringify(data) 得到JSON的parse 数据 

其实就一步 异常容易


分析数据

var http = require("http");

var data = require("./data/inventory");

http.createServer(function(req, res) {

	if (req.url === "/") {
		res.writeHead(200, {"Content-Type": "text/json"});
	    res.end(JSON.stringify(data));
	} else if (req.url === "/instock") {
		listInStock(res);
	} else if (req.url === "/onorder") {
		listOnBackOrder(res);
	} else {
		res.writeHead(404, {"Content-Type": "text/plain"});
		res.end("Whoops... Data not found");
	}

	

}).listen(3000);

console.log("Server listening on port 3000");


function listInStock(res) {

	var inStock = data.filter(function(item) {
		return item.avail === "In stock";
	});

	res.end(JSON.stringify(inStock));

}

function listOnBackOrder(res) {

	var onOrder = data.filter(function(item) {
		return item.avail === "On back order";
	});

	res.end(JSON.stringify(onOrder));

}

我们加入俩个方程 

去分析 得到的data 是否有货

并把数据放在新的附加域名中

我们用filter方程取得到 需要处理的数据

data是一个array

callback方程得到 true 则把这个data加入新的array中

并返还回去

 

-------------------Author: Cvanzy 2018/10/24

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值