《node-https模块》

1,312 阅读4分钟

结合node commander的命令行工具,和百度翻译接口,以及https模块的request构造请求,制作一个命令行翻译工具

一. 百度翻译接口

百度翻译有免费可用的翻译API接口。输入需要将要翻译的单词,源语言,目标语言,用户id,随机码salt,密钥作为参数放在请求url中,其中还需要一个签名sign,它就是用md5对上述信息加密后的32位小写字母。

将以上形成的网址向服务器发出请求,就会得到如下的翻译内容:其中真正的翻译结果在trans_result 里边的dst属性中。这里显示的是utf-8编码。

所以我们要做的就是,通过https的request方法,构造上述的一个请求。用户通过命令行输入要翻译的单词,我们通过node 命令行工具拿到这个单词,发请求,然后得到响应,也就是翻译结果。

二. 在ts文件中运行node

因为node是用js写的,所以在ts文件中引入node模块会找不到。需要安装node的ts类型声明文件。 yarn add --dev @types/node 一般类型文件是给开发者看的,所以加--dev

三. commander js

创建一个cli.ts 。还是按照commander的文档,本次我们熟悉一下.name .usage .arguments 的用法。

const {translate}=require('./main')

const { program } = require('commander');
program.version('0.0.1')
    .name('fy')
    .usage('<english>')
    .arguments('<English>')
    .action((english)=>{
        translate(english)
    })

program.parse(process.argv);

如果不添加这些选项,我们在终端运行ts-node-dev cli -h 打印出帮助信息是这样的:

帮助信息的首行提示是:Usage: cli [options] Usage后边正常是node运行的文件名。

添加.name .usage 后,再次运行,帮助信息的首行提示就是我们指定的选项:代表<english> 是一个必选项

然后用户需要传一个参数,即要翻译的单词。需要用到.arguments 命令行参数。使用<>表示必填项,后可接.action 定义处理函数。所以我们要接收到用户传的参数,然后调用一个translate函数,进行翻译。

四. https.request

通过命令行拿到用户给的单词后,就需要使用https.request函数构造一个请求,向那个百度翻译接口发出。

以下是node 官网上的示例代码。构造一个options对象,里边包含请求url的各种信息,比如主机,端口,路径,请求方法。然后通过https.request方法创建一个请求,在第二个参数回调中,打印出响应内容。

const https = require('https');

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

const req = https.request(options, (res) => {
  console.log('状态码:', res.statusCode);
  console.log('请求头:', res.headers);

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

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

我们只需要把options对象中的url信息修改为那个翻译端口url就可以了。这是给的一个url例子:https://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4

新的路径就是/api/trans/vip/translate ,多了很多查询字符串。我们需要把各种信息拼接成查询字符串。这里要用到一个新的node模块-querystring

1. node - querystring

querystring 模块提供用于解析和格式化 URL 查询字符串的实用工具。

在这里我们只需使用querystring.stringify这个方法,通过遍历对象的自身属性从给定的 obj 生成 URL 查询字符串。

querystring.stringify({ q: 'apple', x: 'xxx' });
// 返回 'q=apple&x=xxx'

2. md5

查询字符串中还有一个sign,它是用md5对各种信息加密得到的一个字符串。node里没有md5,但是有一个md5的npm包。 md5官网

首先安装:yarn add md5

但是这个md5中没有类型声明文件,也就是说不能在ts文件中使用,所以还需要再安装一个类型文件 yarn add --dev @types/md5 然后就可以看到目录中的node_modules目录下有了md5的声明文件:

使用非常简单:

const md5 = require('md5');
console.log(md5('message'));

传入一个字符串,返回经过md5加密的:78e731027d8fd50ed642340b7c9a63b3

3. 构造请求并接收响应内容

与POST方法上传数据类似。我们发出一个请求,在回调中接收响应过来的数据。通过监听responsedata 事件,每有一块数据发过来,就推到数据中。监听end事件,当不再有数据,接收完毕,将Buffer类型的数据转换成我们想要的类型的形式。

const request = https.request(options, (response) => {
        console.log('状态码:', response.statusCode);
        const chunks=[]
        response.on('data',(chunk)=>{
            chunks.push(chunk)
        })
        response.on('end',()=>{
            const data=Buffer.concat(chunks) // 把数据块连接到一起
            console.log(data);
            const string=data.toString()
            console.log(string);
            const result=JSON.parse(string)
            console.log(result);
        })
});

在终端输入以下命令:ts-node-dev cli hello 就会向百度翻译接口发起一个翻译hello这个单词的请求。会得到以下内容:

通过Buffer.concat连接起来的data,是一堆Buffer类型的编码。然后用data.toString()变成字符串,就是返回结果的一个JSON字符串格式。最后用JSON.parse变成相应的对象,就是真正的结果了。

最后我们要做的就是拿出这个结果的trans_result中的dst,才是真正的翻译结果。