手搓一个node测试接口小工具!

简介: 这些库需要安装,我想着搞一个命令行交互式的,可以快捷测试接口,类似于curl那种,只不过我的工具更加傻瓜式。

image.png


嗨嗨嗨,又到了写轮子环节了,为什么要写这个东西呢?


这次带来的还是一个库,我们之前测试接口会使用一些工具,postManapiFox 等。

这些库需要安装,我想着搞一个命令行交互式的,可以快捷测试接口,类似于curl那种,只不过我的工具更加傻瓜式。


文档地www.npmjs.com/package/xmw…


安装


npm i xmwc -g


安装完成之后会有一个命令叫wc


wc -h


可以查看帮助


Usage: wc [options] [command]
请求API
Options:
  -V, --version  output the version number
  -h, --help     display help for command
Commands:
  get            快捷发起get请求
  post           快捷发起post请求
  ws             socket套接字测试


使用方法


直接调用wc命令


wc


1.wc


选择是否从缓存读取Y读取N取消 如果没有使用过建议N


2.选择请求方式 GET POST 等.....


3.选择请求头 application/x-www-form-urlencoded application/json 等


4.输入请求资源路径 也就是url


5.输入参数如果是get可以忽略


6.选择返回格式(默认json) text blob buffer


7.是否缓存 Y 缓存 N 取消 缓存起来可以下次直接使用


成功返回success


失败error


image.png


采用选项式操作,如果添加到缓存里面可以下次直接发起请求


image.png


2.快捷发起请求


如果不想繁琐的去选择也可以使用快捷发送请求


wc get 命令


image.png


wc post


image.png


wc ws 


image.png


支持测试webSocket


源码


#!/usr/bin/env node
import { program } from 'commander' //命令工具
import http from 'node-fetch' //发送请求
import inquirer from 'inquirer' //命令行交互工具
import { Result } from './type'
import chalk from 'chalk' //变颜色
import fs from 'fs'
import path from 'path'
import ws from 'ws' //socket
const cacheJson = require('../cache.json')
const PKG = require('../package.json')
program.version(PKG.version).description('查看版本')
program.description('请求API').action(async () => {
    const { isCache } = await inquirer.prompt([
        {
            type: "confirm",
            name: "isCache",
            message: "是否从缓存中读取"
        },
    ])
    if (isCache) {
        const keys = Object.keys(cacheJson)
        if (keys.length === 0) {
            console.log(chalk.red('暂无缓存'))
        } else {
            const res = await inquirer.prompt([
                {
                    type: "list",
                    name: "cache",
                    choices: keys,
                    message: "请选择缓存的请求"
                }
            ])
            const value = cacheJson[res.cache];
            sendHttp(value)
        }
    } else {
        const result = await inquirer.prompt<Result>([
            {
                type: "list",
                name: "method",
                choices: ['GET', 'POST', 'PUT', 'HEAD', 'DELETE', 'PATCH', 'OPTIONS'],
                default: "GET"
            },
            {
                type: "list",
                name: "header",
                message: "选择请求头",
                choices: [
                    "application/x-www-form-urlencoded",
                    "application/json",
                    "multipart/form-data",
                    "text/plain"
                ]
            },
            {
                type: "input",
                name: "url",
                message: "请求资源路径",
                default: "http:// |  https://"
            },
            {
                type: "input",
                name: "params",
                message: "请输入参数(GET忽略)",
                default: ""
            },
            {
                type: "list",
                name: "response",
                message: "请选择返回格式(默认json)",
                choices: ['json', 'text', 'blob', 'buffer'],
                default: ['json']
            },
            {
                type: "confirm",
                message: "是否缓存",
                name: "cache"
            }
        ])
        sendHttp(result)
    }
})
//读写json文件添加缓存
const cache = <T extends Result>(params: T) => {
    cacheJson[params.method + '-' + params.url.substring(0, 30)] = params;
    fs.writeFileSync(path.join(__dirname, '../cache.json'), JSON.stringify(cacheJson, null, 4))
}
const sendHttp = async <T extends Result>(result: T) => {
    try {
        const response = await http(result.url, {
            method: result.method,
            body: result.params || undefined,
            headers: {
                'Content-Type': result.header
            }
        })
        const val = await response[result.response]()
        if (result.cache) {
            cache(result)
        }
        console.log(chalk.green('success'))
        console.log(val)
    }
    catch (e) {
        console.log(chalk.red('error'))
        console.log(e)
    }
}
//get命令
program.command('get').description('快捷发起get请求').action(async () => {
    const { url } = await inquirer.prompt<{ url: string }>([
        {
            type: "input",
            name: "url",
            message: "快捷请求get请输入url",
            validate(v) {
                if (!v) {
                    return 'url不能为空'
                }
                return true
            }
        }
    ])
    try {
        const response = await http(url).then(res => res.json())
        console.log(chalk.green('success'))
        console.log(response)
    }
    catch (e) {
        console.log(chalk.red('error'))
        console.log(e)
    }
})
//post命令
program.command('post').description('快捷发起post请求').action(async () => {
    const { url, params } = await inquirer.prompt<{ url: string, params: string }>([
        {
            type: "input",
            name: "url",
            message: "快捷请求post请输入url",
            validate(v) {
                if (!v) {
                    return 'url不能为空'
                }
                return true
            }
        },
        {
            type: "input",
            name: "params",
            message: "请输入参数(没有请忽略)",
            default: ""
        }
    ])
    try {
        const response = await http(url, {
            method: "post",
            body: JSON.stringify(params) || undefined,
            headers: {
                'Content-Type': 'application/json'
            }
        }).then(res => res.json())
        console.log(chalk.green('success'))
        console.log(response)
    }
    catch (e) {
        console.log(chalk.red('error'))
        console.log(e)
    }
})
//ws命令
program.command('ws').description('socket套接字测试').action(async () => {
    const { url } = await inquirer.prompt<{url:string}>({
        type: "input",
        message: "请输入ws | wss 协议地址",
        name: "url"
    })
    const socket = new ws(url)
    socket.on('open', () => {
        console.log('socket 已连接')
    })
    socket.on('message', (e) => {
        console.log('result:' + e.toString())
    })
    socket.on('error', (e) => {
        console.log('error', e)
    })
    socket.on('close', () => {
        console.log('socket 已断开')
    })
})
program.parse(process.argv)


目录
相关文章
|
1月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
2月前
|
Java 测试技术 数据安全/隐私保护
软件测试中的自动化策略与工具应用
在软件开发的快速迭代中,自动化测试以其高效、稳定的特点成为了质量保证的重要手段。本文将深入探讨自动化测试的核心概念、常见工具的应用,以及如何设计有效的自动化测试策略,旨在为读者提供一套完整的自动化测试解决方案,帮助团队提升测试效率和软件质量。
|
13天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
46 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
16天前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
85 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
14天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
47 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
6天前
|
小程序 测试技术 数据安全/隐私保护
微信公众号接口测试实战指南
微信公众号接口测试是确保系统稳定性和功能完整性的重要环节。本文详细介绍了测试全流程,包括准备、工具选择(如Postman、JMeter)、用例设计与执行,以及常见问题的解决方法。通过全面测试,可以提前发现潜在问题,优化用户体验,确保公众号上线后稳定运行。内容涵盖基础接口、高级接口、微信支付和数据统计接口的测试,强调了功能验证、性能优化、安全保护及用户体验的重要性。未来,随着微信生态的发展,接口测试将面临更多挑战和机遇,如小程序融合、AI应用和国际化拓展。
|
1月前
|
存储 测试技术 数据库
接口测试工具攻略:轻松掌握测试技巧
在互联网快速发展的今天,软件系统的复杂性不断增加,接口测试工具成为确保系统稳定性的关键。它如同“翻译官”,模拟请求、解析响应、验证结果、测试性能并支持自动化测试,确保不同系统间信息传递的准确性和完整性。通过Apifox等工具,设计和执行测试用例更加便捷高效。接口测试是保障系统稳定运行的第一道防线。
|
1月前
|
Web App开发 JSON 测试技术
API测试工具集合:让接口测试更简单高效
在当今软件开发领域,接口测试工具如Postman、Apifox、Swagger等成为确保API正确性、性能和可靠性的关键。Postman全球闻名但高级功能需付费,Apifox则集成了API文档、调试、Mock与自动化测试,简化工作流并提高团队协作效率,特别适合国内用户。Swagger自动生成文档,YApi开源但功能逐渐落后,Insomnia界面简洁却缺乏团队协作支持,Paw仅限Mac系统。综合来看,Apifox是国内用户的理想选择,提供中文界面和免费高效的功能。
|
2月前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
282 17
Selenium:强大的 Web 自动化测试工具
|
1月前
|
存储 资源调度 JavaScript
npm、cnpm 和 pnpm 是三种常用的 Node.js 包管理工具
npm、cnpm 和 pnpm 是三种常用的 Node.js 包管理工具。npm 是官方默认的包管理器,提供依赖管理、安装和更新等功能;cnpm 是由阿里巴巴开发的 npm 镜像,专为中国大陆用户优化,解决下载速度慢的问题;pnpm 通过硬链接技术提高安装速度并节省磁盘空间,特别适合磁盘资源紧张的环境。三者命令类似,但各有特色,开发者可根据需求选择合适的工具。
126 5

热门文章

最新文章

  • 1
    小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
  • 2
    3天功能开发→3小时:通义灵码2.0+DEEPSEEK实测报告,单元测试生成准确率92%的秘密
  • 3
    Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
  • 4
    基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 6
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
  • 7
    「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
  • 8
    用户说 | 通义灵码2.0,跨语言编码+自动生成单元测试+集成DeepSeek模型且免费使用
  • 9
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
  • 10
    AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架