使用node的服务器请求初解

682 阅读4分钟

前几天写了一个翻译小工具,使用了node.js的http服务器请求,在这里记录一下使用的步骤和注意事项

本章知识点

  1. 百度翻译平台接口
  2. md5加密转换
  3. http.request请求
  4. typescript转JavaScript并发送的npm

百度翻译平台

首先在 百度翻译平台 注册,申请一个通用翻译的api,标准版的就够用

然后根据文档与支持里的通用翻译文档进行查看和操作 在操作过程中,app ID和密钥都需要保密,如果泄漏有可能别人也会调用,调用的多的话就会扣钱

拼接完整请求:
http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&
salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4

请求参数:
     q=apple
     from=en
     to=zh
     appid=2015063000000001(请替换为您的appid)
     salt=1435660288(随机码)
     平台分配的密钥: 12345678

生成签名sign:
Step1. 拼接字符串1:
拼接appid=2015063000000001+q=apple+salt=1435660288+密钥=12345678得到字符串1:“2015063000000001apple143566028812345678”
Step2. 计算签名:(对字符串1做md5加密)
sign=md5(2015063000000001apple143566028812345678),得到sign=f89f9594663708c1605f3d736d01d2d4

代码会上传的github或其他开源网站,所以这个时候就要使用md5进行加密了

md5加密

MD5在线加密转化网站

百度翻译的请求链接中的请求参数需要用到md5加密转化使用的是32位小写

项目中使用md5

在项目中如果要使用md5需要下载md5库

yarn add md5

因为我使用的是typescript;所以MD5也要搭配typescript使用

yarn add --dev @types/md5

在项目中引入md5

然后直接使用,转化为md5加密

const sign = md5(要加密的内容) ;

http.request请求的使用方式

node.js中http.request的使用文档

url地址的请求参数是 ?后面的 :http://api.fanyi.baidu.com/translate?q=apple&from=en&to=zh&appid=2015063000000001& salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4 它并不是固定不变的,当请求的内容不一样时,里面的参数会变化;

所以需要把它拼装在一起 这个时候可以使用querystring.stringify(),它是将参数变成由 & 相连的字符串 q=hi&sign=1234

querystring.stringify({q: 'hi', sign: '1234'})
// q=hi&sign=1234

https.request需要有两个参数,一个是options参数,另一个是回调函数;

options会自动拼接成url,回调函数是请求后对返回数据的操作

response.on是对数据的监控; req.end() 来表示请求的结束

    const options = {
        hostname: 'api.fanyi.baidu.com',
        port: 443,
        path: '/api/trans/vip/translate?'+query,
        method: 'GET'
    };

    const req = https.request(options, (response) => {
        response.on('data', (d) => {

        });
    });

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

请求返回来的数据都是Buffer类型的,有时候一次性传不完,还会接着几次传递,所以要拼接数据

完整的代码:

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

        //监听请求到的结果,并把它变成字符串
        let chunks:Buffer[] = [];
        response.on('data', (chunk:Buffer) => {
            chunks.push(chunk)
        });
        response.on('end',()=>{
            const string = Buffer.concat(chunks).toString();
            //定义一个返回结果的类型
            type BaiduResult={
                error_code?:string;
                error_msg?:string;
                from:string;
                to:string;
                trans_result:{src:string,dst:string}[];
            }
            const object:BaiduResult = JSON.parse(string);
            if(object.error_code){
                console.log(errorMap[object.error_code] || object.error_msg);
                //退出当前任务
                process.exit(2)
            }else {
                console.log(object.trans_result[0].dst)
                //退出当前进程,0表示没有错误
                process.exit(0)
            }
        })
    });

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

上传到npm

上传之前需要将typescript转化为JavaScript,并且生成dist目录,只上传dist目录的文件

初始化

会生成一个配置文件tsconfig.json

tsc --init

将outDir修改 "outFile": "dist/",

在cli.ts里第一行添加,告诉程序使用node执行

#!/usr/bin/env node

执行tsc,会生成dist目录,所有的ts文件都会转化为js文件

tsc

修改package.json

{
  "name": "uath-translate",
  "version": "0.0.1",
 "main": "dist/main.js",
  //使用fy代替 "dist/cli.js"使用时只需要执行   fy 单词
  "bin": {
    "fy": "dist/cli.js"
  },
  //只上传dist目录下的js文件
  "files": [
    "dist/**/*.js"
  ],
  "scripts": {
    "start": "ts-node-dev src/main.ts"
  },

开始上传

发送之前要把淘宝源修改为npm的官方源

使用 nrm ls 查看源

如果此时你使用的是淘宝源,切换到npm的官方源

nrm use npm

登录你的npm账户

npm adduser

上传

npm public

下载安装测试

在另一个命令行窗口下载,测试

我的npm包名字是uath-translate

npm i -g uath-translate