node构建自己的API服务器系列二:IP解析服务

原创 Dean 程序相关,系列文章 二维码阅读
2018-10-06 22:19

上一节讲到了node API服务器基础框架的搭建并建立了一个简单却实用的服务-日志服务,你可以点击这里穿越,本节我们将基于上一节搭建的框架继续实现一个比较常用的服务,IP解析服务。

或许很多朋友会问,现在不是有许多免费的IP解析接口,为什么还要多此一举呢?首先,返回的数据结构不是我们想要的,还有就是如果我们前端直接调用会涉及跨域的问题,虽然用代理服务(后面的文章会将如何用node实现一个代理服务)的方式可以解决跨域问题,但是不够明了,索性自己写一个。首先,明确一点我们的IP解析服务也是基于现在免费的IP解析接口,然后列举一下到目前为止依然可用的免费IP解析服务:

1、淘宝的IP解析服务

地址:http://ip.taobao.com/service/getIpInfo.php?ip=115.156.133.84

2、126 IP解析服务

地址:http://ip.ws.126.net/ipquery?ip=115.156.133.84

3、WHOIS IP解析服务

地址:http://whois.pconline.com.cn/?ip=115.156.133.84

这里,我们选用淘宝的IP解析服务,其实我们要做的很简单就是得到IP地址之后请求淘宝的IP解析服务得到IP信息的结果,然后按照我们设定的数据结构做一下封装。

在开发IP解析服务之前,我们首先需要规划一下路由:

1、/ip 获取访问者IP,并解析出访问者IP对应的信息

2、/ip/:ip 获得传入的IP,并解析出传入IP对应的信息

路由规划好了之后,我们就可以着手编写IP解析服务了

由于我们需要请求接口,所以我们需要安装一个依赖库request,功能很强大,有兴趣的请自行科普,github地址:https://github.com/request/request,安装方式:

npm i request --save

然后创建在routes目录下创建IP解析路由处理文件ip.js,编写代码:

const fs = require('fs');
const path = require('path');
const express = require('express');

// 导入工具方法
const { setHeader, setJSONResponse } = require('../utils/res');
const getIp = require('../utils/getIp');
const parseIp = require('../utils/parseIp');

const router = express.Router();

// 获取访问者IP并解析信息
router.get('/', (req, res) => {
	setHeader(res, 'Access-Control-Allow-Origin', '*');
	setHeader(res, 'content-type', 'application/json;charset=utf-8');
	const ip = getIp(req);
	parseIp(ip)
		.then(data => {
			setJSONResponse(res, {
				ret: 0,
				data
			});
		})
		.catch(err => {console.log(err)

			setJSONResponse(res, {
				ret: -1
			});
		});
});

// 获取传入IP并解析信息
router.get('/:ip', (req, res) => {
	setHeader(res, 'Access-Control-Allow-Origin', '*');
	setHeader(res, 'content-type', 'application/json;charset=utf-8');
	const { ip } = req.params;
	parseIp(ip)
		.then(data => {
			setJSONResponse(res, {
				ret: 0,
				data
			});
		})
		.catch(err => {
			setJSONResponse(res, {
				ret: -1
			});
		});
});

module.exports = router;

这里分别导入了两个工具方法

parseIp.js:

const request = require('request');
const template = require('./template');

const CHA_API = 'http://ip.taobao.com/service/getIpInfo.php?ip=<%=ip%>';

function parseIp(ip) {
	return new Promise((resolve, reject) => {
		const api = template(CHA_API, {
			ip
		});
		request({
			url: api
		}, (err, response, body) => {
			if (err) {
				reject();
			} else {
				try {
					const ret = JSON.parse(body);
					if (ret.code === 0 && ret.data) {
						resolve(ret.data);
					} else {
						reject();
					}
				} catch (err) {
					console.log(err);
					reject();
				};
			}
		});
	});
}

module.exports = parseIp;

template.js:

function template(tmpl, data) {
  return tmpl.replace(/<%=([^%]*)%>/g, function(s, m) {
    return data[m];
  });
};

module.exports = template;

请自行放倒utils目录下

路由处理文件编写好后,我们只需要在入口文件app.js中导入路由处理文件ip.js,并建立路由映射关系:

app.use('/ip', ipHandler);

然后,运行

node app.js

启动服务器,访问http://127.0.0.1:1314/ip/获取本机IP的信息,访问http://127.0.0.1:1314/ip/115.156.133.84获取IP115.156.133.84的信息。

到这里,本节就结束了,最后附上运行截图和源码:

你可以点击这里下载示例代码。

系列文章导航:

第一节:node构建自己的API服务器系列一:日志服务

第三节:node构建自己的API服务器系列三:代理服务

第四节:node构建自己的API服务器系列四:快递单识别服务

第五节:node构建自己的API服务器系列五:邮件发送服务

本文地址:https://www.deanhan.cn/node-api-server-series-2.html
版权声明:本文为原创文章,版权归 Dean 所有,欢迎分享本文,转载请保留出处!
  • 支付宝二维码 支付宝
  • 微信二维码 微信