文档中心

基于OpenAPI规范的标准化技术文档枢纽,提供版本化、交互式、机器可读的API全生命周期管理解决方案。

未找到包含 "" 的相关产品

产品目录

铁路行业列车资讯

服务正常 全站会员免费包年包月按量计费次数包 交通出行服务 2026-05-18 30 万次

聚合最新的铁路、列车、车票相关行业资讯文章,支持列表分页与文章详情两种模式。列表模式返回标题、摘要、封面图、发布日期与下一页标记,详情模式返回完整正文 HTML 与纯文本、字数、分类、来源等元信息。可直接用于资讯频道、首页 Banner、内容运营推送等场景。

调用权限
正常
请求频率限制
10次/秒 (10 QPS)
免费额度
4000
参考价格
0.003元/次

计费优先级(按已开通的计费类型依次校验):

全站会员->单独包月->次数包->点数计费->账户余额->免费额度

账户余额:

该产品支持账户余额抵扣,每次扣除金额:0.005 元/次

全站会员:

全站会员有效期内,可免费使用本产品。

包年包月:

包月价格 包季价格 包年价格
¥ 50.00 约 1.61 元/天 ¥ 120.00 约 1.33 元/天 ¥ 360.00 约 0.98 元/天

次数包:

额度 价格 有效期
10000 (次) ¥ 30 低至0.003/次 一年
100000 (次) ¥ 268 低至0.00268/次 一年
1000000 (次) ¥ 2180 低至0.00218/次 一年

免费额度:

总免费额度 每月免费额度 每日免费额度
4000 (次) 400 (次) 包含在总免费额度 20 (次) 包含在总免费额度

请求限制:

免费/测试用户请求频率限制 请求频率总限制 全站会员请求频率限制 每日请求次数总限制
5秒1次 每个免费用户的QPS总限制 1秒10次 每个用户QPS总限制 1秒10次 每个全站会员用户的QPS总限制 100000 (次) 每个用户每日请求总次数

其他准入要求:

  • 账户余额/点数/次数包计费的用户,不限制请求频率(QPS)
  • 账户余额/点数/次数包计费的用户,不限制每日请求次数(RPD)
  • 接口地址: https://www.ninyao.cn/api/cch/index

    返回格式: application/json

    请求方式: HTTPGET

    请求HEADER:

    名称值
    Content-Typeapplication/x-www-form-urlencoded;charset:utf-8;

    请求参数说明:

    名称必填类型示例值说明
    key是string35kj5jnlj53453kl5j43nj5接口密钥,在控制台->密钥管理查看
    mode是stringlist查询模式:list=资讯列表分页、detail=指定文章详情
    page否int1list 模式下的页码,默认 1(detail 模式忽略此参数)
    id否int11267detail 模式必填:文章数字 id(取自列表返回的 articles[].id)

    返回参数说明:

    名称类型说明
    codeint状态码,200=成功
    successbool是否成功
    messagestring状态信息
    data.enginestring引擎标识
    data.pageint(list)当前页码
    data.has_nextbool(list)是否有下一页
    data.next_pageint(list)下一页页码,无下一页为 0
    data.total_countint(list)本页文章数
    data.articlesarray(list)文章列表
    data.articles[].idint(list)文章数字 id
    data.articles[].titlestring(list)标题
    data.articles[].summarystring(list)摘要
    data.articles[].coverstring(list)封面图地址
    data.articles[].datestring(list)发布日期
    data.articles[].url_pathstring(list)详情页路径
    data.idint(detail)文章 id
    data.titlestring(detail)标题
    data.categorystring(detail)分类
    data.datestring(detail)发布时间
    data.sourcestring(detail)来源
    data.url_pathstring(detail)详情页路径
    data.word_countint(detail)正文字数
    data.content_textstring(detail)纯文本正文
    data.content_htmlstring(detail)富文本正文 HTML
    debugstring/array调试数据
    exec_timefloat执行耗时(秒)
    user_ipstring客户端IP
    timestampint服务器时间戳

    免责声明:

    本服务仅供个人学习、学术研究目的使用,未经授权,请勿分享、传播输入及生成的文本、图片内容。用户在从事与本服务相关的一切行为(包括但不限于访问浏览、利用、转载、宣传介绍)时,应以善意且谨慎的态度行事并承担相应的风险和责任。用户需确保不得利用本服务进行危害国家安全和社会公共利益、扰乱经济秩序和社会秩序、侵犯他人合法权益等法律、行政法规禁止的活动,并且自定义输入文本不得包含违反法律法规、政治相关、侵犯他人合法权益的内容。对于用户因使用本服务而导致的任何损失或风险,包括但不限于由于使用本服务而产生的错误、疏忽、中断、删除、故障、延迟或通讯线路故障所导致的任何损失或损害,本服务的开发者将不承担任何责任。

    请求示例:

    https://www.ninyao.cn/api/cch/index?key=你的密钥&mode=看文档&page=看文档&id=看文档

    返回示例:

    {"code": 200,"success": true,"message": "查询成功","data": {"page": 1,"has_next": true,"next_page": 2,"total_count": 20,"articles": [{"id": 11267,"title": "列车员拾金不昧,交回万元财物","summary": "某列车工作人员在一次列车运行中,检获了一个内含现金和身份凭证的单肩手提包。从最初的报告环节,到最终确定并执行物品归还的方案,整个处置过程展现出极高的效率和严密的组织性。这绝非一次简单的个人善举,而是建立在一套完善、成熟的制度框架和高效运转机制之上的体现。若想深入理解“拾物归位”这种美德如何被提升为一个可靠、可信赖的公共服务标准,我们需要从多个维度的支撑体系进行深入的拆解与分析。从制度架构师的角度审","cover": "https://pic.liecheba.com/uploads/7/202605/12/t16fa2e12e500f6b4f9e2edd3a5e29c50.png","date": "2026-05-12","url_path": "/zixun/11267.html"},{"id": 11266,"title": "山东地震致列车停运,多趟列车受影响","summary": "致所有计划前往华北及周边地区的旅客们,请务必高度关注本次铁路运输线路的调整与变动信息。由于外部环境因素的影响,部分列车服务不得不进行临时性调整,为了确保您的出行安全与行程的顺畅,请您仔细阅读以下详细的铁路运营公告,并提前做好充分的备用行程规划。本次铁路服务调整的背景,是由于山东省德州市平原县近期发生了一起里氏5.5级的地震事件。基于铁路部门对乘客安全的高度重视,为将旅客带往一个更加稳妥的环境,铁路","cover": "https://pic.liecheba.com/uploads/7/202605/12/tb7ade1c2fc2b215753870adc6e69051b.png","date": "2026-05-12","url_path": "/zixun/11266.html"},{"id": 11264,"title": "虹桥火车站网约车接驳点升级:人车分离,新增蓄车位,提升出行安全与效率。","summary": "【虹桥交通枢纽升级】网约车接驳点迎来重大革新!实现人流与车流的彻底分离,新增超大型临时蓄车空间,大幅提升旅客上下车的效率与安全性。近期,上海虹桥交通枢纽的关键节点——P10—B1临时网约车上客点改造工程已圆满竣工,并正式迈入了试运行阶段。此次升级项目,旨在全面提升大型交通枢纽在高峰时段的运营效率,为数以万计的旅客提供一个更加安全、便捷、顺畅的出行接驳环境。这不仅是一次简单的设施修缮,更是一次基于人","cover": "https://pic.liecheba.com/uploads/7/202605/12/tf732f15b25661075cc43a3d2b6af8627.png","date": "2026-05-12","url_path": "/zixun/11264.html"},{"id": 11263,"title": "购买英菲尼迪QX50的必看指南:它到底值不值?","summary": "当一位朋友提出需求时,他明确指出了几个核心诉求:预算控制在四十万元左右的SUV,但它必须是小众、具有极高个性化风格,同时还要能散发出高级的豪华气息。基于这些要求,大众化的车型,例如X3或GLC,自然就被排除在了考虑范围之外。我的目光因此转向了那些以精湛工匠精神著称的日系豪华品牌。虽然在初看外观时,英菲尼迪QX50这类车型可能会首先浮现在脑海,但在深入了解和体验了它之后,我逐渐意识到,这款车型的魅力","cover": "https://pic.liecheba.com/uploads/7/202605/12/t0e13caf1663c4d0dfa968fa317b00611.png","date": "2026-05-12","url_path": "/zixun/11263.html"},{"id": 11262,"title": "35万体验英菲尼迪QX50:三屏大联屏,2.0T动力,油耗低至7.7L。","summary": "在探讨日系汽车品牌时,我们对一些热门车型了解得非常透彻,但总有这样一个品牌,它的存在感往往被我们所忽略。它拥有着极具吸引力的市场定位——以亲民的成本,却能提供媲美豪华品牌的驾乘体验。没错,我们谈论的正是英菲尼迪。今天,我们将重点深入剖析英菲尼迪旗下的一款非常经典且具有代表性的中型SUV——QX50。这款车型,凭借其独特的价值组合,一直以来都是市场关注的焦点。从市场定位来看,它属于中型SUV的范畴,","cover": "https://pic.liecheba.com/uploads/7/202605/12/t0eed0b02a27724d9b3fec580434c23ca.png","date": "2026-05-12","url_path": "/zixun/11262.html"},{"id": 11261,"title": "独自带宝宝坐火车:从崩溃到温暖,列车长出手相助。","summary": "新手妈妈带娃出行挑战:一场暖心列车长援手的感动之旅在繁忙的现代生活中,带着年幼的宝宝进行长途旅行,对任何新手父母来说,都是一项巨大的挑战。这篇暖心的事迹,讲述了一位名叫陈琳的母亲,独自带着一个刚满两个月的儿子,从广州前往四川老家的经历。故事发生在2026年4月22日,在一趟从广州开往成都的K192次列车上。由于丈夫在广州工地工作,而婆婆身体不适无法提供帮助,陈琳不得不肩负起独自照顾宝宝和完成长途跋","cover": "https://pic.liecheba.com/uploads/7/202605/12/t0ffd8997ca64260d38e1ebdf196ebe73.png","date": "2026-05-12","url_path": "/zixun/11261.html"},{"id": 11260,"title": "高铁站台是否应该禁烟?我的看法是应该。","summary": "#深入探讨:高铁站台禁烟,是保障公共安全与文明出行的必然选择当高铁列车如同银色的巨龙,以令人惊叹的速度穿梭于城市与城市之间,它不仅代表着中国现代化的速度与效率,更构建起一张连接全国的生命脉络。高铁站台,作为无数旅客汇聚、起程与归来的核心枢纽,承载着巨大的社会流量和能量。然而,在这样一个追求高效、洁净、文明的现代空间里,偶尔弥漫升起的青烟,无疑像一道刺眼的污点,与整体的现代化气质格格不入。因此,“是","cover": "https://pic.liecheba.com/uploads/7/202605/12/t2090592da8213ade157d3c8e0e8e84af.png","date": "2026-05-12","url_path": "/zixun/11260.html"},{"id": 11259,"title": "不惜一切代价也要坐绿皮火车","summary": "对于长途旅行的规划,有时我们需要绕过那些看似完美的直达路线,去寻找一条更具烟火气、更符合个人需求的选择。近期,由于春夏季的调图调整,原本直达北京的黄山线路K1110次列车,其始发地发生了变化,从黄山直达的便利性,转变为需要从杭州始发。这使得许多习惯了快捷交通的旅客,在规划前往北京的行程时,不得不重新审视传统的旅行路径。当直达线路受阻后,我们自然会转向查询最便捷的替代方案,比如高铁。然而,在仔细研究","cover": "https://pic.liecheba.com/uploads/7/202605/12/t171b2b97818258c3eb5dd0bdabfa1226.png","date": "2026-05-12","url_path": "/zixun/11259.html"},{"id": 11251,"title": "专列带您穿越青藏高原:安全舒适的西藏深度游全攻略","summary": "探索青藏高原的魅力,一直以来都是无数旅行者的梦想。然而,如何安全、舒适、高效地抵达这片广袤而壮丽的土地,一直是旅行规划中的一大难题。传统的交通方式,无论是高强度的自驾穿越,还是面对高原反应的飞机抵达,都让许多游客望而却步。因此,以铁路为载体的精品旅游专列,正成为连接游客与青藏高原的最佳解决方案,它不仅提供了一种全新的出行模式,更是一种全方位的、无忧的深度体验。以近期开行的“大美青海·幸福西藏”主题","cover": "https://pic.liecheba.com/uploads/7/202605/12/t74ac477838aa2b37ecfd4dd7cc5d0a9b.png","date": "2026-05-12","url_path": "/zixun/11251.html"},{"id": 11246,"title": "远去的列车背景图:捕捉逝去时光的背影","summary": "当那列长途的铁轨列车发出悠长而富有节奏感的鸣笛声,它仿佛带着一种无可抗拒的使命感,缓缓地、坚定地碾过铺展在眼前的铁轨长廊。这趟旅程,其轨迹指引着它向着更遥远的远方前行,连那绚烂至极的、如同流动的晚霞色彩,也只能在它强大的动能面前,被抛却在身后,成为昨日的背景图景。在窗户的边缘,那些熟悉的面庞匆匆地划过我的视线,它们与疾驰而过的风一同,将我们之间那些不舍的、道别的气息,彻底地吹散在了广阔的大气之中。","cover": "https://pic.liecheba.com/uploads/7/202605/11/t907b32eaf7bf20dd1a586538a65fe012.png","date": "2026-05-11","url_path": "/zixun/11246.html"},{"id": 11245,"title": "高铁与动车的区别 高铁列车与动车","summary": "在长期的铁路出行经验中,绝大多数旅客其实都难以准确分辨“高铁”与“动车”之间的本质区别。这种认知上的模糊,往往会导致我们在订票时盲目追求高价车次,从而产生不必要的经济支出。很多乘客在购票时,习惯性地认为“G字头”代表高铁,“D字头”代表动车,并理所当然地觉得只要是G字头,价格贵一些也是为了换取更快的速度。我曾经也持有这种观念,直到近期经历了一段从武汉前往成都的旅程,才发现这种认知存在偏差。当时我乘","cover": "https://pic.liecheba.com/uploads/7/202605/11/t61f928f85ce29c8901543aeb5b88cfb0.png","date": "2026-05-11","url_path": "/zixun/11245.html"},{"id": 11244,"title": "福州站出发的普通列车","summary": "福州站坐落于福州市的晋安区,其身份定位为一座重要的级站。从设施规模来看,该站场拥有7条铁轨和14条线路,并设有12个客运站台,体现了其承载巨大的客运量和复杂的交通网络。福州站的战略意义体现在其接入了多个关键的铁路干线,包括峰福铁路、杭深铁路、昌福铁路、合福高铁以及福厦高铁等主干线。因此,该站的交通流量极其旺盛,每天可有超过280趟列车经过或在此停留,其中包含了大量的动车组列车和传统的普速客运列车。","cover": "https://pic.liecheba.com/uploads/7/202605/11/t6c5bf095d8bd16d527e41f64815331a9.png","date": "2026-05-11","url_path": "/zixun/11244.html"},{"id": 11243,"title": "许昌高铁东站进站口,胖东来购物袋随客流四散而去","summary": "高铁站旅行安全指南:如何避免“购物袋失踪”的惊魂一幕每一次搭乘高铁,都伴随着旅行的兴奋与期待。然而,在人流密集、节奏飞快的交通枢纽,旅行的便捷性往往会伴随着一些不为人知的“小陷阱”。尤其是在大型高铁站,如许昌高铁东站这样的繁忙进站口,熙熙攘攘的旅客如同潮水般涌动,手里提着各种精心挑选的物品,其中,那些印着品牌标识的购物袋,就成了最容易引发“拿错”困境的载体。从个人亲身经历来看,这种“购物袋拿错”的","cover": "https://pic.liecheba.com/uploads/7/202605/11/t2673217d02819abd6b333da10b2e588f.png","date": "2026-05-11","url_path": "/zixun/11243.html"},{"id": 11242,"title": "旅游列车焕新升级,消费热情直达高铁速度","summary": "当前,文旅市场正经历一次强劲的复苏和结构性升级。随着旅游出行需求的持续旺盛,国内的铁路交通系统作为连接人流、物流和信息流的核心动脉,也迎来了前所未有的变革浪潮。全国范围内的旅游列车和交通服务正在进行系统性的迭代和优化,这不仅仅是交通工具的更新,更是一场旨在激活消费潜能、带动地方经济复苏的综合性战略布局。通过一系列硬核的升级和创新,文旅消费的活力正被高效地拉升,达到了媲美高铁速度的加速度。首先,我们","cover": "https://pic.liecheba.com/uploads/7/202605/11/t8a36062a5dc9370a8b00726d21981b5a.png","date": "2026-05-11","url_path": "/zixun/11242.html"},{"id": 11241,"title": "列车长喂饭的温暖瞬间:治愈人心的暖心故事","summary": "在日常的快节奏生活中,偶尔一次不期而遇的温暖,总能像一道光,照亮我们疲惫的心灵。最近,一段发生在列车上的暖心视频,迅速在网络上引起了巨大的共鸣,它不仅仅是一个感人的故事,更像是一曲献给“人间温情”的赞歌,让无数网友为这份纯粹的善意感动落泪。这个故事的发生地,是在一列载着思念与期盼的T269次列车上。故事的主角是一位外出务工的中年男子,他怀揣着重返故乡、探望家人的心切,踏上了前往新疆阿克苏的长途旅程","cover": "https://pic.liecheba.com/uploads/7/202605/11/tdda7d1a313e83f7be0fb10e46cc75690.png","date": "2026-05-11","url_path": "/zixun/11241.html"},{"id": 11240,"title": "如何驾驶地铁列车?","summary": "我们日常生活中驾驶机动车辆,相信这是大多数人普遍认知和具备的技能。由于道路网络的复杂性、车流的密集性,驾驶过程要求驾驶员必须时刻关注车辆的纵向、横向乃至多维度的环境变化。然而,与此形成鲜明对比的地铁系统,其运行轨迹却被限制在一套固定的铁轨之上。许多人可能会好奇,在这样的单轨制环境下,地铁的操控和运行究竟是怎样的?从纯粹的机械操作角度来看,地铁的驾驶过程,其实远比想象中要简单得多。在控制端,驾驶员面","cover": "https://pic.liecheba.com/uploads/7/202605/11/t7cd681d3fce1cc4b177b1ebd4a9a9852.png","date": "2026-05-11","url_path": "/zixun/11240.html"},{"id": 11239,"title": "中国铁路劳务派遣的列车员情况","summary": "当我们描绘中国铁路运输系统的宏大图景时,脑海中往往浮现的是高速列车群恢弘的运行气象、气派非凡的交通枢纽站台,以及身着制服、服务周到的专业工作人员。然而,支撑着这个庞大、复杂的交通网络能够每日平稳、高效运转的,其实还有一个规模同样庞大,却相对低调、默默奉献的群体——即劳务派遣人员。他们所发挥的价值和作用,常常被外界的目光所忽略,甚至连行业内部也对其战略意义有所低估。本文将从多个维度,深入探讨这个关键","cover": "https://pic.liecheba.com/uploads/7/202605/11/tbcf667ff139ee6940072480084bc8d58.png","date": "2026-05-11","url_path": "/zixun/11239.html"},{"id": 11238,"title": "内蒙古多趟列车停运,旅客请留意最新信息","summary": "鉴于铁路运输网络运营的复杂性和季节性调整需求,中国铁路系统近期发布了多批次旅客列车运行时刻表变动通知。这些调整旨在优化整体运力配置,提升运营效率,并确保在不同时间段内为广大旅客提供更稳定、更可靠的出行服务。因此,所有计划乘坐相关列车的旅客,务必仔细研读以下列车服务中断和调整的具体安排,以免造成行程上的误解或不便。在早期阶段的调整通知中,我们关注到多个线路的列车班次进行了集中调整。首先,从二月十八日","cover": "https://pic.liecheba.com/uploads/7/202605/11/ta6e8dfb8822fde639f1de5d3b4feba13.png","date": "2026-05-11","url_path": "/zixun/11238.html"},{"id": 11237,"title": "2027年武汉11号线四期列车交付:新列车型号与“武汉列车号”详解","summary": "对于武汉汉阳区和四新区域而言,本次交通网络的升级并非仅仅是简单地增设一条地铁线路。它代表的是一次深刻的区域功能重塑和价值跃升。随着武汉地铁11号线四期阶段性加速推进,该线路的规划目标,加上武汉枢纽直通线的布局、白沙洲公铁大桥的建成,以及汉阳高铁站的定位,这些核心基础设施项目的同步发力,正在从根本上重构汉阳区的城市地理坐标和通勤体验。许多人对一座城市发生交通变化时的感知,往往是高度直观且实用的:过去","cover": "https://pic.liecheba.com/uploads/7/202605/11/t85f616722705636660a7c73be3dc8004.png","date": "2026-05-11","url_path": "/zixun/11237.html"},{"id": 11236,"title": "京沪二线和京沪高铁路线对比分析-京沪二线和京沪高铁路线有什么不同","summary": "当我们讨论京沪干线铁路的升级与补充时,核心问题便聚焦于两条线路的根本区别:京沪高铁主要采取的是一条向西延伸、服务于内陆核心城市的路线;而京沪二线则选择了一条更偏向东部沿海、覆盖广阔苏北和鲁南区域的辅助通道。因此,除了起点和终点位于北京和上海这两个超级枢纽城市之外,这两条线路在途经的城市群、服务的人口结构以及其运行的战略定位上,几乎是完全不重叠的,具有互补的性质。一、线路走向与地理特征的根本差异京沪","cover": "https://pic.liecheba.com/uploads/7/202605/11/t95c4ef2357a0baad67adfdc9a667e96c.png","date": "2026-05-11","url_path": "/zixun/11236.html"}],"engine": "您要数据 全国列车时刻智核 v1.0"},"debug": "","exec_time": 0.2301,"user_ip": "39.98.183.172","timestamp": 1779082658,"tip": "此接口由您要数据独家开发,购买开源接口源码联系WX:gzdswj"}
    错误码类型说明
    403int没有权限
    400int参数传递不正确
    500int服务器内部错误
    本示例代码演示了接口的基础调用流程,开发者需自行将代码中的默认值替换为实际的API接口认证信息。
    
    <?php
    /**
     * API请求DEMO
     * 
     * 本demo支持常见的HTTP请求方法(GET/POST/PUT/DELETE等)
     */
    
     //基本配置
    $api_key = '你的接口密钥,登录控制台后在密钥管理页面申请';
    $secret_key = '';
    
    // API请求示例:
    try {
        $client = new ApiClient($api_key, $secret_key);
        $client->setTimeout(10);
        $client->setVerifySSL(false); // 关闭SSL验证
    
        // GET请求示例
        echo "=== 开始GET请求 ===\n";
        $response = $client->get('https://www.ninyao.cn/api/cch/index', [
            'key' => $api_key,
            'key2' => '其他参数'
        ]);
        print_r($response);
        //print_r($client->getLastRequestInfo());
        /* 
        // POST表单示例
        echo "\n=== 开始POST请求 ===\n";
        $response = $client->post('接口地址', [
            'key' => $api_key,
            'key2' => '其他参数'
        ]);
        print_r($response);
        print_r($client->getLastRequestInfo());
    
        // POST JSON示例
        echo "\n=== 开始POST JSON请求 ===\n";
        $response = $client->postJson('接口地址', [
            'key' => $api_key,
            'key2' => '其他参数'
        ]);
        print_r($response);
        print_r($client->getLastRequestInfo());
         */
    } catch (ApiClientException $e) {
        echo "API请求错误: " . $e->getMessage();
        if ($e->getCode() > 0) {
            echo " (HTTP状态码: " . $e->getCode() . ")";
        }
        print_r($client->getLastRequestInfo() ?? []);
    }
    
    /**
     * API客户端类
     * 
     * 提供了一个简单的HTTP API客户端实现,支持常见的HTTP请求方法(GET/POST/PUT/DELETE等)
     * 具有以下主要功能:
     * - 支持 API 密钥和签名认证
     * - 可配置请求超时和SSL验证
     * - 支持自定义请求头
     * - 支持表单和JSON格式的请求体
     * - 自动解析响应结果
     * - 提供详细的请求信息记录
     * 
     * 使用示例:
     * ```
     * $client = new ApiClient('https://api.example.com', 'api_key', 'secret_key');
     * $response = $client->get('/users', ['page' => 1]);
     * ```
     * 
     * @throws ApiClientException 当API请求失败时抛出异常
     */
    class ApiClient
    {
        private $apiKey;
        private $secretKey;
        private $timeout = 30;
        private $verifySSL = true;
        private $lastRequestInfo = [];
        private $defaultHeaders = [];
    
        /**
         * 构造函数
         * 
         * @param string $apiKey  API密钥(可选)
         * @param string $secretKey 签名密钥(可选)
         */
        public function __construct(string $apiKey = '', string $secretKey = '')
        {
            $this->apiKey = $apiKey;
            $this->secretKey = $secretKey;
        }
    
        /**
         * 设置请求超时时间(秒)
         */
        public function setTimeout(int $seconds): self
        {
            $this->timeout = $seconds;
            return $this;
        }
    
        /**
         * 设置是否验证SSL证书
         */
        public function setVerifySSL(bool $verify): self
        {
            $this->verifySSL = $verify;
            return $this;
        }
    
        /**
         * 添加默认请求头
         */
        public function addDefaultHeader(string $name, string $value): self
        {
            $this->defaultHeaders[$name] = $value;
            return $this;
        }
    
        /**
         * 发送GET请求
         * 
         * @param string $endpoint 接口端点
         * @param array  $query    查询参数
         * @param array  $headers  额外请求头
         */
        public function get(string $endpoint, array $query = [], array $headers = []): array
        {
            return $this->request('GET', $endpoint, [
                'query' => $query,
                'headers' => $headers
            ]);
        }
    
        /**
         * 发送POST请求(表单格式)
         * 
         * @param string $endpoint 接口端点
         * @param array  $data     POST数据
         * @param array  $headers  额外请求头
         */
        public function post(string $endpoint, array $data = [], array $headers = []): array
        {
            return $this->request('POST', $endpoint, [
                'form_data' => $data,
                'headers' => $headers
            ]);
        }
    
        /**
         * 发送POST请求(JSON格式)
         * 
         * @param string $endpoint 接口端点
         * @param array  $data     POST数据
         * @param array  $headers  额外请求头
         */
        public function postJson(string $endpoint, array $data = [], array $headers = []): array
        {
            return $this->request('POST', $endpoint, [
                'json' => $data,
                'headers' => array_merge(['Content-Type' => 'application/json'], $headers)
            ]);
        }
    
        /**
         * 发送PUT请求
         */
        public function put(string $endpoint, array $data = [], array $headers = []): array
        {
            return $this->request('PUT', $endpoint, [
                'json' => $data,
                'headers' => $headers
            ]);
        }
    
        /**
         * 发送DELETE请求
         */
        public function delete(string $endpoint, array $data = [], array $headers = []): array
        {
            return $this->request('DELETE', $endpoint, [
                'json' => $data,
                'headers' => $headers
            ]);
        }
    
        /**
         * 获取最后一次请求的详细信息
         */
        public function getLastRequestInfo(): array
        {
            return $this->lastRequestInfo;
        }
    
        /**
         * 基础请求方法
         */
        private function request(string $method, string $endpoint, array $options = []): array
        {
            // 初始化cURL
            $ch = curl_init();
            $url = ltrim($endpoint, '/');
    
            // 准备请求头
            $headers = $this->prepareHeaders($options['headers'] ?? []);
    
            // 处理查询参数
            if (!empty($options['query'])) {
                $url .= '?' . http_build_query($options['query']);
            }
    
            // 处理请求体
            $postData = null;
            if (isset($options['form_data'])) {
                $postData = http_build_query($options['form_data']);
                $headers[] = 'Content-Type: application/x-www-form-urlencoded';
            } elseif (isset($options['json'])) {
                $postData = json_encode($options['json']);
                $headers[] = 'Content-Type: application/json';
            }
    
            // 设置cURL选项
            curl_setopt_array($ch, [
                CURLOPT_URL => $url,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_CUSTOMREQUEST => $method,
                CURLOPT_HTTPHEADER => $headers,
                CURLOPT_TIMEOUT => $this->timeout,
                CURLOPT_SSL_VERIFYPEER => $this->verifySSL,
                CURLOPT_SSL_VERIFYHOST => $this->verifySSL,
                CURLOPT_HEADER => true,
            ]);
    
            if ($method !== 'GET' && $postData !== null) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
            }
    
            // 执行请求
            $response = curl_exec($ch);
            $error = curl_error($ch);
            $info = $this->lastRequestInfo = curl_getinfo($ch);
            curl_close($ch);
    
            // 处理错误
            if ($error) {
                throw new ApiClientException("cURL请求失败: " . $error);
            }
    
            // 分离响应头和响应体
            $headerSize = $info['header_size'];
            $responseHeaders = substr($response, 0, $headerSize);
            $responseBody = substr($response, $headerSize);
    
            // 解析响应
            $result = json_decode($responseBody, true) ?? $responseBody;
    
            // 检查HTTP状态码
            if ($info['http_code'] >= 400) {
                $errorMsg = is_array($result) ? ($result['message'] ?? $responseBody) : $responseBody;
                throw new ApiClientException("API请求失败: " . $errorMsg, $info['http_code']);
            }
    
            return [
                'status' => $info['http_code'],
                'headers' => $this->parseHeaders($responseHeaders),
                'data' => $result
            ];
        }
    
        /**
         * 准备请求头(自动添加签名)
         */
        private function prepareHeaders(array $headers): array
        {
            // 合并默认头
            $headers = array_merge($this->defaultHeaders, $headers);
    
            // 添加签名头
            if ($this->apiKey && $this->secretKey) {
                $timestamp = time();
                $signString = "key={$this->apiKey}&timestamp={$timestamp}";
                $signature = hash_hmac('sha256', $signString, $this->secretKey);
    
                $headers['X-Api-Key'] = $this->apiKey;
                $headers['X-Api-Timestamp'] = $timestamp;
                $headers['X-Api-Sign'] = $signature;
            }
    
            // 转换为cURL格式
            $curlHeaders = [];
            foreach ($headers as $name => $value) {
                $curlHeaders[] = "$name: $value";
            }
    
            return $curlHeaders;
        }
    
        /**
         * 解析响应头
         */
        private function parseHeaders(string $headers): array
        {
            $parsed = [];
            foreach (explode("\r\n", $headers) as $i => $line) {
                if ($i === 0) {
                    $parsed['HTTP_CODE'] = $line;
                } else {
                    $parts = explode(': ', $line, 2);
                    if (count($parts) === 2) {
                        $parsed[$parts[0]] = $parts[1];
                    }
                }
            }
            return $parsed;
        }
    }
    
    class ApiClientException extends \Exception
    {
        // 自定义异常类
    }
    
    
    
    
    
    
    /**
     * 原生JS通用API请求函数(支持GET/POST,JSON格式)
     * @param {string} url - API接口完整地址
     * @param {string} method - 请求方法,仅支持GET/POST
     * @param {object} [data={}] - 请求参数(GET拼接到URL,POST作为JSON请求体)
     * @returns {Promise} - 返回接口响应的JSON数据
     */
    async function requestApi(url, method, data = {}) {
      try {
        // 处理GET请求:拼接参数到URL
        let requestUrl = url;
        if (method.toUpperCase() === 'GET' && Object.keys(data).length > 0) {
          const params = new URLSearchParams(data).toString();
          requestUrl = `${requestUrl}${requestUrl.includes('?') ? '&' : '?'}${params}`;
        }
    
        // 配置请求选项
        const requestOptions = {
          method: method.toUpperCase(),
          headers: { 'Content-Type': 'application/json' },
          credentials: 'include' // 跨域时携带Cookie,不需要可改为omit
        };
    
        // 处理POST请求:设置JSON请求体
        if (method.toUpperCase() === 'POST') {
          requestOptions.body = JSON.stringify(data);
        }
    
        // 发送请求并处理响应
        const response = await fetch(requestUrl, requestOptions);
        if (!response.ok) throw new Error(`请求失败:${response.status} ${response.statusText}`);
        const result = await response.json(); // 自动解析JSON响应
        return result;
    
      } catch (error) {
        console.error('API请求错误:', error.message);
        throw error; // 抛出错误供调用方处理
      }
    }
    
    // -------------------------- 使用示例 --------------------------
    // 1. GET请求示例(查询数据)
    async function testGet() {
      try {
        const data = await requestApi(
          'https://api.example.com/user/list', // 替换为实际接口地址
          'GET',
          { page: 1, size: 10, keyword: 'test' } // GET请求参数
        );
        console.log('GET请求成功:', data);
        // 业务逻辑处理...
      } catch (err) {
        alert('GET请求失败:' + err.message);
      }
    }
    
    // 2. POST请求示例(提交数据)
    async function testPost() {
      try {
        const data = await requestApi(
          'https://api.example.com/user/login', // 替换为实际接口地址
          'POST',
          { username: 'admin', password: '123456' } // POST请求体数据
        );
        console.log('POST请求成功:', data);
        // 业务逻辑处理...
      } catch (err) {
        alert('POST请求失败:' + err.message);
      }
    }
    
    // 执行请求(按需调用)
    // testGet();
    // testPost();
    
    
    import okhttp3.*;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    /**
     * Java 单文件实现GET/POST(JSON) API请求
     * 基于OkHttp和Jackson,复制后直接使用(需添加Maven/Gradle依赖)
     */
    public class ApiRequest {
        // 全局OkHttpClient实例(复用连接池)
        private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(10, TimeUnit.SECONDS)
                .build();
    
        // Jackson JSON解析工具
        private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    
        /**
         * GET请求方法
         * @param url 接口地址
         * @param params URL参数键值对
         * @return 接口响应字符串
         * @throws IOException 网络异常
         */
        public static String doGet(String url, Map params) throws IOException {
            HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
            if (params != null && !params.isEmpty()) {
                for (Map.Entry entry : params.entrySet()) {
                    urlBuilder.addQueryParameter(entry.getKey(), entry.getValue());
                }
            }
            Request request = new Request.Builder().url(urlBuilder.build()).get().build();
            try (Response response = OK_HTTP_CLIENT.newCall(request).execute()) {
                if (!response.isSuccessful()) {
                    throw new IOException("GET请求失败:" + response.code() + " " + response.message());
                }
                return response.body() != null ? response.body().string() : "";
            }
        }
    
        /**
         * POST(JSON)请求方法
         * @param url 接口地址
         * @param jsonStr JSON请求体字符串
         * @return 接口响应字符串
         * @throws IOException 网络异常
         */
        public static String doPostJson(String url, String jsonStr) throws IOException {
            MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
            RequestBody requestBody = RequestBody.create(mediaType, jsonStr);
            Request request = new Request.Builder().url(url).post(requestBody).build();
            try (Response response = OK_HTTP_CLIENT.newCall(request).execute()) {
                if (!response.isSuccessful()) {
                    throw new IOException("POST请求失败:" + response.code() + " " + response.message());
                }
                return response.body() != null ? response.body().string() : "";
            }
        }
    
        /**
         * 格式化JSON字符串(便于阅读)
         * @param jsonStr 原始JSON字符串
         * @return 格式化后的JSON
         * @throws IOException 解析异常
         */
        public static String formatJson(String jsonStr) throws IOException {
            if (jsonStr == null || jsonStr.isEmpty()) {
                return "";
            }
            Object jsonObj = OBJECT_MAPPER.readValue(jsonStr, Object.class);
            return OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObj);
        }
    
        // 主方法:测试GET/POST请求
        public static void main(String[] args) {
            try {
                // ------------------- 测试GET请求 -------------------
                String getUrl = "https://api.example.com/user/list"; // 替换为实际接口地址
                Map getParams = new HashMap<>();
                getParams.put("page", "1");
                getParams.put("size", "10");
                getParams.put("keyword", "test");
                String getResponse = doGet(getUrl, getParams);
                System.out.println("=== GET请求响应结果 ===");
                System.out.println(formatJson(getResponse));
    
                System.out.println("------------------------");
    
                // ------------------- 测试POST请求 -------------------
                String postUrl = "https://api.example.com/user/login"; // 替换为实际接口地址
                Map postData = new HashMap<>();
                postData.put("username", "admin");
                postData.put("password", "123456");
                String jsonStr = OBJECT_MAPPER.writeValueAsString(postData);
                String postResponse = doPostJson(postUrl, jsonStr);
                System.out.println("=== POST请求响应结果 ===");
                System.out.println(formatJson(postResponse));
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    package main
    
    import (
    	"bytes"
    	"encoding/json"
    	"fmt"
    	"io/ioutil"
    	"net/http"
    	"net/url"
    	"time"
    )
    
    // 全局HTTP客户端,设置超时时间
    var httpClient = &http.Client{
    	Timeout: 10 * time.Second, // 请求超时时间10秒
    }
    
    // DoGet 发送GET请求,自动拼接URL参数
    // urlStr: 接口地址
    // params: URL查询参数(键值对)
    // 返回:响应体字符串、错误信息
    func DoGet(urlStr string, params map[string]string) (string, error) {
    	// 解析基础URL
    	parsedUrl, err := url.Parse(urlStr)
    	if err != nil {
    		return "", fmt.Errorf("URL解析失败: %v", err)
    	}
    
    	// 拼接查询参数
    	query := parsedUrl.Query()
    	for key, value := range params {
    		query.Add(key, value)
    	}
    	parsedUrl.RawQuery = query.Encode()
    
    	// 发送GET请求
    	resp, err := httpClient.Get(parsedUrl.String())
    	if err != nil {
    		return "", fmt.Errorf("GET请求失败: %v", err)
    	}
    	defer resp.Body.Close() // 确保响应体关闭
    
    	// 检查响应状态码
    	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
    		return "", fmt.Errorf("请求返回异常状态码: %d", resp.StatusCode)
    	}
    
    	// 读取响应体
    	body, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		return "", fmt.Errorf("读取响应体失败: %v", err)
    	}
    
    	return string(body), nil
    }
    
    // DoPostJson 发送POST请求,JSON格式请求体
    // urlStr: 接口地址
    // data: 请求体数据(任意可序列化为JSON的结构体/Map)
    // 返回:响应体字符串、错误信息
    func DoPostJson(urlStr string, data interface{}) (string, error) {
    	// 将数据序列化为JSON字节流
    	jsonData, err := json.Marshal(data)
    	if err != nil {
    		return "", fmt.Errorf("JSON序列化失败: %v", err)
    	}
    
    	// 发送POST请求
    	resp, err := httpClient.Post(urlStr, "application/json", bytes.NewBuffer(jsonData))
    	if err != nil {
    		return "", fmt.Errorf("POST请求失败: %v", err)
    	}
    	defer resp.Body.Close()
    
    	// 检查响应状态码
    	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
    		return "", fmt.Errorf("请求返回异常状态码: %d", resp.StatusCode)
    	}
    
    	// 读取响应体
    	body, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		return "", fmt.Errorf("读取响应体失败: %v", err)
    	}
    
    	return string(body), nil
    }
    
    // FormatJson 格式化JSON字符串(便于控制台阅读)
    func FormatJson(jsonStr string) string {
    	var prettyJson bytes.Buffer
    	err := json.Indent(&prettyJson, []byte(jsonStr), "", "  ")
    	if err != nil {
    		return jsonStr // 格式化失败则返回原字符串
    	}
    	return prettyJson.String()
    }
    
    func main() {
    	// ------------------- 测试GET请求 -------------------
    	fmt.Println("=== 开始测试GET请求 ===")
    	getUrl := "https://api.example.com/user/list" // 替换为实际接口地址
    	getParams := map[string]string{
    		"page":    "1",
    		"size":    "10",
    		"keyword": "test",
    	}
    	getResp, err := DoGet(getUrl, getParams)
    	if err != nil {
    		fmt.Printf("GET请求出错: %v\n", err)
    	} else {
    		fmt.Println("GET请求响应结果:\n", FormatJson(getResp))
    	}
    
    	fmt.Println("------------------------")
    
    	// ------------------- 测试POST请求 -------------------
    	fmt.Println("=== 开始测试POST请求 ===")
    	postUrl := "https://api.example.com/user/login" // 替换为实际接口地址
    	// 定义POST请求体(可替换为自定义结构体)
    	postData := map[string]string{
    		"username": "admin",
    		"password": "123456",
    	}
    	postResp, err := DoPostJson(postUrl, postData)
    	if err != nil {
    		fmt.Printf("POST请求出错: %v\n", err)
    	} else {
    		fmt.Println("POST请求响应结果:\n", FormatJson(postResp))
    	}
    }
    
    
    import requests
    import json
    
    # 配置全局请求超时时间(单位:秒)
    TIMEOUT = 10
    
    def do_get(url: str, params: dict = None) -> str:
        """
        发送GET请求
        :param url: 接口地址
        :param params: URL查询参数(字典)
        :return: 响应体字符串(格式化后的JSON)
        :raises Exception: 请求失败时抛出异常
        """
        try:
            # 发送GET请求
            response = requests.get(url, params=params, timeout=TIMEOUT)
            # 检查响应状态码
            response.raise_for_status()
            # 返回格式化后的JSON字符串
            return json.dumps(response.json(), indent=2, ensure_ascii=False)
        except requests.exceptions.RequestException as e:
            raise Exception(f"GET请求失败: {str(e)}")
    
    def do_post_json(url: str, data: dict = None) -> str:
        """
        发送POST请求(JSON格式请求体)
        :param url: 接口地址
        :param data: JSON请求体(字典)
        :return: 响应体字符串(格式化后的JSON)
        :raises Exception: 请求失败时抛出异常
        """
        try:
            # 发送POST请求,自动设置Content-Type为application/json
            response = requests.post(url, json=data, timeout=TIMEOUT)
            # 检查响应状态码
            response.raise_for_status()
            # 返回格式化后的JSON字符串
            return json.dumps(response.json(), indent=2, ensure_ascii=False)
        except requests.exceptions.RequestException as e:
            raise Exception(f"POST请求失败: {str(e)}")
    
    if __name__ == "__main__":
        # ------------------- 测试GET请求 -------------------
        print("=== 开始测试GET请求 ===")
        get_url = "https://api.example.com/user/list"  # 替换为实际接口地址
        get_params = {
            "page": 1,
            "size": 10,
            "keyword": "test"
        }
        try:
            get_resp = do_get(get_url, get_params)
            print("GET请求响应结果:\n", get_resp)
        except Exception as e:
            print(e)
    
        print("-" * 40)
    
        # ------------------- 测试POST请求 -------------------
        print("=== 开始测试POST请求 ===")
        post_url = "https://api.example.com/user/login"  # 替换为实际接口地址
        post_data = {
            "username": "admin",
            "password": "123456"
        }
        try:
            post_resp = do_post_json(post_url, post_data)
            print("POST请求响应结果:\n", post_resp)
        except Exception as e:
            print(e)
    
    
    
    const http = require('http');
    const https = require('https');
    const querystring = require('querystring');
    
    /**
     * 通用请求函数(支持GET/POST,JSON格式)
     * @param {string} url - 接口完整地址
     * @param {string} method - GET/POST
     * @param {object} [data={}] - 请求参数(GET拼URL,POST为JSON体)
     * @returns {Promise} - 响应JSON数据
     */
    function requestApi(url, method, data = {}) {
      return new Promise((resolve, reject) => {
        // 解析URL
        const urlObj = new URL(url);
        const isHttps = urlObj.protocol === 'https:';
        const client = isHttps ? https : http;
    
        // 处理GET参数
        let path = urlObj.pathname;
        if (method.toUpperCase() === 'GET' && Object.keys(data).length > 0) {
          const params = querystring.stringify(data);
          path += (urlObj.search ? '&' : '?') + params;
        }
    
        // 处理POST请求体
        let postData = '';
        if (method.toUpperCase() === 'POST') {
          postData = JSON.stringify(data);
        }
    
        // 配置请求选项
        const options = {
          hostname: urlObj.hostname,
          port: urlObj.port || (isHttps ? 443 : 80),
          path: path + urlObj.search,
          method: method.toUpperCase(),
          headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'Content-Length': Buffer.byteLength(postData)
          }
        };
    
        // 发送请求
        const req = client.request(options, (res) => {
          let rawData = '';
          res.on('data', (chunk) => { rawData += chunk; });
          res.on('end', () => {
            try {
              // 解析JSON响应
              const result = JSON.parse(rawData);
              resolve(result);
            } catch (err) {
              reject(new Error(`响应解析失败: ${err.message}`));
            }
          });
        });
    
        // 错误处理
        req.on('error', (err) => {
          reject(new Error(`请求失败: ${err.message}`));
        });
    
        // 写入POST请求体
        if (method.toUpperCase() === 'POST') {
          req.write(postData);
        }
        req.end();
      });
    }
    
    // 测试主函数
    async function main() {
      try {
        // ------------------- 测试GET请求 -------------------
        console.log('=== 开始测试GET请求 ===');
        const getUrl = 'https://api.example.com/user/list'; // 替换为实际接口
        const getParams = { page: 1, size: 10, keyword: 'test' };
        const getResult = await requestApi(getUrl, 'GET', getParams);
        console.log('GET请求响应:', JSON.stringify(getResult, null, 2));
    
        console.log('------------------------');
    
        // ------------------- 测试POST请求 -------------------
        console.log('=== 开始测试POST请求 ===');
        const postUrl = 'https://api.example.com/user/login'; // 替换为实际接口
        const postData = { username: 'admin', password: '123456' };
        const postResult = await requestApi(postUrl, 'POST', postData);
        console.log('POST请求响应:', JSON.stringify(postResult, null, 2));
      } catch (err) {
        console.error('请求出错:', err.message);
      }
    }
    
    // 执行测试
    main();
    
    
    
    #include 
    #include 
    #include 
    #include 
    
    // 定义缓冲区结构体,用于存储响应数据
    typedef struct {
        char* data;
        size_t size;
    } ResponseBuffer;
    
    // libcurl的写回调函数,将响应数据写入缓冲区
    static size_t write_callback(void* contents, size_t size, size_t nmemb, void* userp) {
        size_t realsize = size * nmemb;
        ResponseBuffer* buffer = (ResponseBuffer*)userp;
    
        // 重新分配内存存储响应数据
        char* temp = realloc(buffer->data, buffer->size + realsize + 1);
        if (temp == NULL) {
            fprintf(stderr, "内存分配失败!\n");
            return 0;
        }
        buffer->data = temp;
        memcpy(&(buffer->data[buffer->size]), contents, realsize);
        buffer->size += realsize;
        buffer->data[buffer->size] = '\0'; // 字符串结束符
    
        return realsize;
    }
    
    // 初始化响应缓冲区
    void init_buffer(ResponseBuffer* buffer) {
        buffer->data = malloc(1);
        buffer->size = 0;
    }
    
    // 释放响应缓冲区内存
    void free_buffer(ResponseBuffer* buffer) {
        free(buffer->data);
        buffer->data = NULL;
        buffer->size = 0;
    }
    
    /**
     * 发送GET请求
     * @param url 接口地址
     * @param params URL参数(格式:"key1=value1&key2=value2",传NULL则无参数)
     * @return 响应字符串(需手动free释放),失败返回NULL
     */
    char* http_get(const char* url, const char* params) {
        CURL* curl = curl_easy_init();
        if (!curl) {
            fprintf(stderr, "CURL初始化失败!\n");
            return NULL;
        }
    
        ResponseBuffer buffer;
        init_buffer(&buffer);
    
        // 拼接GET请求的URL和参数
        char* full_url = NULL;
        if (params && strlen(params) > 0) {
            full_url = (char*)malloc(strlen(url) + strlen(params) + 2);
            sprintf(full_url, "%s?%s", url, params);
        } else {
            full_url = (char*)malloc(strlen(url) + 1);
            strcpy(full_url, url);
        }
    
        // 设置CURL选项
        curl_easy_setopt(curl, CURLOPT_URL, full_url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L); // 超时时间10秒
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); // 跟随重定向
    
        // 执行GET请求
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            fprintf(stderr, "GET请求失败: %s\n", curl_easy_strerror(res));
            free_buffer(&buffer);
            free(full_url);
            curl_easy_cleanup(curl);
            return NULL;
        }
    
        // 检查响应状态码
        long response_code;
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
        if (response_code < 200 || response_code >= 300) {
            fprintf(stderr, "GET请求返回异常状态码: %ld\n", response_code);
            free_buffer(&buffer);
            free(full_url);
            curl_easy_cleanup(curl);
            return NULL;
        }
    
        // 释放资源
        free(full_url);
        curl_easy_cleanup(curl);
    
        // 返回响应数据(需调用者手动free)
        return buffer.data;
    }
    
    /**
     * 发送POST请求(JSON格式请求体)
     * @param url 接口地址
     * @param json_data JSON请求体字符串
     * @return 响应字符串(需手动free释放),失败返回NULL
     */
    char* http_post_json(const char* url, const char* json_data) {
        CURL* curl = curl_easy_init();
        if (!curl) {
            fprintf(stderr, "CURL初始化失败!\n");
            return NULL;
        }
    
        ResponseBuffer buffer;
        init_buffer(&buffer);
    
        // 设置CURL选项
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L); // 超时时间10秒
        curl_easy_setopt(curl, CURLOPT_POST, 1L); // 启用POST请求
    
        // 设置JSON请求体和请求头
        struct curl_slist* headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json; charset=utf-8");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(json_data));
    
        // 执行POST请求
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            fprintf(stderr, "POST请求失败: %s\n", curl_easy_strerror(res));
            free_buffer(&buffer);
            curl_slist_free_all(headers);
            curl_easy_cleanup(curl);
            return NULL;
        }
    
        // 检查响应状态码
        long response_code;
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
        if (response_code < 200 || response_code >= 300) {
            fprintf(stderr, "POST请求返回异常状态码: %ld\n", response_code);
            free_buffer(&buffer);
            curl_slist_free_all(headers);
            curl_easy_cleanup(curl);
            return NULL;
        }
    
        // 释放资源
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    
        // 返回响应数据(需调用者手动free)
        return buffer.data;
    }
    
    int main(void) {
        // 初始化libcurl
        curl_global_init(CURL_GLOBAL_ALL);
    
        // ------------------- 测试GET请求 -------------------
        printf("=== 开始测试GET请求 ===\n");
        const char* get_url = "https://api.example.com/user/list"; // 替换为实际接口
        const char* get_params = "page=1&size=10&keyword=test";   // GET参数
        char* get_resp = http_get(get_url, get_params);
        if (get_resp) {
            printf("GET请求响应结果:\n%s\n", get_resp);
            free(get_resp); // 释放响应内存
        }
    
        printf("------------------------\n");
    
        // ------------------- 测试POST请求 -------------------
        printf("=== 开始测试POST请求 ===\n");
        const char* post_url = "https://api.example.com/user/login"; // 替换为实际接口
        const char* post_json = "{\"username\":\"admin\",\"password\":\"123456\"}"; // JSON请求体
        char* post_resp = http_post_json(post_url, post_json);
        if (post_resp) {
            printf("POST请求响应结果:\n%s\n", post_resp);
            free(post_resp); // 释放响应内存
        }
    
        // 清理libcurl全局资源
        curl_global_cleanup();
        return 0;
    }
    
    
    
    #include 
    #include 
    #include 
    #include 
    
    // 响应数据缓冲区类,封装内存管理
    class ResponseBuffer {
    public:
        std::string data; // 存储响应数据的字符串,自动管理内存
    
        // libcurl写回调函数,将响应数据写入缓冲区
        static size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
            size_t realSize = size * nmemb;
            ResponseBuffer* buffer = static_cast(userp);
            buffer->data.append(static_cast(contents), realSize);
            return realSize;
        }
    };
    
    // HTTP请求工具类,封装GET/POST(JSON)方法
    class HttpRequester {
    private:
        CURL* curl; // CURL句柄
        long timeout; // 请求超时时间(秒)
    
    public:
        // 构造函数:初始化CURL
        HttpRequester(long timeout = 10) : timeout(timeout) {
            curl_global_init(CURL_GLOBAL_ALL);
            curl = curl_easy_init();
            if (!curl) {
                throw std::runtime_error("CURL初始化失败!");
            }
            // 设置全局超时
            curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout);
            // 跟随HTTP重定向
            curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        }
    
        // 析构函数:释放CURL资源
        ~HttpRequester() {
            if (curl) {
                curl_easy_cleanup(curl);
            }
            curl_global_cleanup();
        }
    
        // 禁用拷贝构造和赋值,避免资源重复释放
        HttpRequester(const HttpRequester&) = delete;
        HttpRequester& operator=(const HttpRequester&) = delete;
    
        /**
         * 发送GET请求
         * @param url 接口地址
         * @param params URL参数(格式:"key1=value1&key2=value2")
         * @return 响应字符串
         * @throws std::runtime_error 请求失败时抛出异常
         */
        std::string Get(const std::string& url, const std::string& params = "") {
            if (!curl) {
                throw std::runtime_error("CURL句柄未初始化");
            }
    
            // 拼接完整URL(带参数)
            std::string fullUrl = url;
            if (!params.empty()) {
                fullUrl += "?" + params;
            }
    
            ResponseBuffer buffer;
            // 设置CURL选项
            curl_easy_setopt(curl, CURLOPT_URL, fullUrl.c_str());
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ResponseBuffer::WriteCallback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
    
            // 执行GET请求
            CURLcode res = curl_easy_perform(curl);
            if (res != CURLE_OK) {
                throw std::runtime_error("GET请求失败: " + std::string(curl_easy_strerror(res)));
            }
    
            // 检查响应状态码
            long responseCode;
            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode);
            if (responseCode < 200 || responseCode >= 300) {
                throw std::runtime_error("GET请求返回异常状态码: " + std::to_string(responseCode));
            }
    
            return buffer.data;
        }
    
        /**
         * 发送POST请求(JSON格式请求体)
         * @param url 接口地址
         * @param jsonData JSON请求体字符串
         * @return 响应字符串
         * @throws std::runtime_error 请求失败时抛出异常
         */
        std::string PostJson(const std::string& url, const std::string& jsonData) {
            if (!curl) {
                throw std::runtime_error("CURL句柄未初始化");
            }
    
            ResponseBuffer buffer;
            // 设置POST请求基础选项
            curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
            curl_easy_setopt(curl, CURLOPT_POST, 1L); // 启用POST方法
            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str()); // 设置请求体
            curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, jsonData.length()); // 设置请求体长度
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ResponseBuffer::WriteCallback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
    
            // 设置JSON请求头
            struct curl_slist* headers = nullptr;
            headers = curl_slist_append(headers, "Content-Type: application/json; charset=utf-8");
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    
            // 执行POST请求
            CURLcode res = curl_easy_perform(curl);
            // 释放请求头链表(无论请求成功与否都要释放)
            curl_slist_free_all(headers);
    
            if (res != CURLE_OK) {
                throw std::runtime_error("POST请求失败: " + std::string(curl_easy_strerror(res)));
            }
    
            // 检查响应状态码
            long responseCode;
            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode);
            if (responseCode < 200 || responseCode >= 300) {
                throw std::runtime_error("POST请求返回异常状态码: " + std::to_string(responseCode));
            }
    
            return buffer.data;
        }
    };
    
    // 主函数:测试GET/POST请求
    int main() {
        try {
            // 创建HTTP请求器实例
            HttpRequester requester;
    
            // ------------------- 测试GET请求 -------------------
            std::cout << "=== 开始测试GET请求 ===" << std::endl;
            std::string getUrl = "https://api.example.com/user/list"; // 替换为实际接口
            std::string getParams = "page=1&size=10&keyword=test";   // GET参数
            std::string getResp = requester.Get(getUrl, getParams);
            std::cout << "GET请求响应结果:\n" << getResp << std::endl;
    
            std::cout << "------------------------" << std::endl;
    
            // ------------------- 测试POST请求 -------------------
            std::cout << "=== 开始测试POST请求 ===" << std::endl;
            std::string postUrl = "https://api.example.com/user/login"; // 替换为实际接口
            std::string postJson = R"({"username":"admin","password":"123456"})"; // JSON请求体(原生字符串避免转义)
            std::string postResp = requester.PostJson(postUrl, postJson);
            std::cout << "POST请求响应结果:\n" << postResp << std::endl;
    
        } catch (const std::exception& e) {
            // 捕获所有异常并打印
            std::cerr << "请求出错: " << e.what() << std::endl;
            return 1;
        }
    
        return 0;
    }
    
    
    
    using System;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;
    using System.Text.Json;
    
    /// 
    /// HTTP请求工具类,封装GET/POST(JSON)请求
    /// 
    public class HttpRequester
    {
        // 静态HttpClient实例(推荐单例使用,避免频繁创建释放连接)
        private static readonly HttpClient _httpClient = new HttpClient
        {
            Timeout = TimeSpan.FromSeconds(10) // 设置10秒超时
        };
    
        /// 
        /// 发送GET请求
        /// 
        /// 接口完整地址
        /// URL查询参数(键值对)
        /// 格式化后的JSON响应字符串
        /// 请求失败时抛出异常
        public static async Task GetAsync(string url, System.Collections.Generic.Dictionary paramsDict = null)
        {
            // 拼接查询参数
            if (paramsDict != null && paramsDict.Count > 0)
            {
                var queryBuilder = new System.Text.StringBuilder();
                foreach (var pair in paramsDict)
                {
                    queryBuilder.Append($"{Uri.EscapeDataString(pair.Key)}={Uri.EscapeDataString(pair.Value)}&");
                }
                string query = queryBuilder.ToString().TrimEnd('&');
                url += $"{(url.Contains("?") ? "&" : "?")}{query}";
            }
    
            // 发送GET请求
            using var response = await _httpClient.GetAsync(url);
            // 检查响应状态码,非2xx则抛出异常
            response.EnsureSuccessStatusCode();
    
            // 读取响应并格式化JSON
            string jsonResponse = await response.Content.ReadAsStringAsync();
            return FormatJson(jsonResponse);
        }
    
        /// 
        /// 发送POST请求(JSON格式请求体)
        /// 
        /// 接口完整地址
        /// 请求体数据(任意可序列化的对象)
        /// 格式化后的JSON响应字符串
        /// 请求失败时抛出异常
        public static async Task PostJsonAsync(string url, T data)
        {
            // 将对象序列化为JSON字符串
            string jsonData = JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = false });
            // 构造JSON请求体
            using var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
            // 发送POST请求
            using var response = await _httpClient.PostAsync(url, content);
            // 检查响应状态码
            response.EnsureSuccessStatusCode();
    
            // 读取响应并格式化JSON
            string jsonResponse = await response.Content.ReadAsStringAsync();
            return FormatJson(jsonResponse);
        }
    
        /// 
        /// 格式化JSON字符串(便于阅读)
        /// 
        private static string FormatJson(string json)
        {
            if (string.IsNullOrEmpty(json)) return json;
            var jsonDoc = JsonDocument.Parse(json);
            return JsonSerializer.Serialize(jsonDoc, new JsonSerializerOptions { WriteIndented = true });
        }
    }
    
    /// 
    /// 测试类,包含主函数
    /// 
    class Program
    {
        // C# 7.1+支持Main方法为async
        static async Task Main(string[] args)
        {
            try
            {
                // ------------------- 测试GET请求 -------------------
                Console.WriteLine("=== 开始测试GET请求 ===");
                string getUrl = "https://api.example.com/user/list"; // 替换为实际接口
                var getParams = new System.Collections.Generic.Dictionary
                {
                    { "page", "1" },
                    { "size", "10" },
                    { "keyword", "test" }
                };
                string getResponse = await HttpRequester.GetAsync(getUrl, getParams);
                Console.WriteLine("GET请求响应结果:\n" + getResponse);
    
                Console.WriteLine("------------------------");
    
                // ------------------- 测试POST请求 -------------------
                Console.WriteLine("=== 开始测试POST请求 ===");
                string postUrl = "https://api.example.com/user/login"; // 替换为实际接口
                // 定义请求体对象(可替换为自定义类)
                var postData = new
                {
                    username = "admin",
                    password = "123456"
                };
                string postResponse = await HttpRequester.PostJsonAsync(postUrl, postData);
                Console.WriteLine("POST请求响应结果:\n" + postResponse);
            }
            catch (HttpRequestException ex)
            {
                Console.WriteLine($"请求失败: {ex.Message}");
                if (ex.InnerException != null)
                {
                    Console.WriteLine($"内部异常: {ex.InnerException.Message}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"程序异常: {ex.Message}");
            }
    
            // 防止控制台立即关闭
            Console.WriteLine("\n按任意键退出...");
            Console.ReadKey();
        }
    }
    
    
    
    ' 引入必要的命名空间
    Imports System
    Imports System.Net.Http
    Imports System.Text
    Imports System.Threading.Tasks
    Imports System.Collections.Generic
    Imports System.Text.Json
    Imports System.Net.Http.Headers
    
    ''' 
    ''' HTTP请求工具类,封装GET/POST(JSON)核心逻辑
    ''' 基于.NET内置HttpClient,支持异步请求、JSON序列化/反序列化
    ''' 
    Public Class HttpHelper
        ' 静态HttpClient单例(推荐单例使用,避免端口耗尽)
        Private Shared ReadOnly _httpClient As New HttpClient With {
            .Timeout = TimeSpan.FromSeconds(10) ' 设置10秒请求超时
        }
    
        ''' 
        ''' 发送GET请求,自动拼接URL参数
        ''' 
        ''' 接口基础地址
        ''' URL查询参数(键值对)
        ''' 格式化后的JSON响应字符串
        Public Shared Async Function SendGetRequestAsync(baseUrl As String, Optional parameters As Dictionary(Of String, String) = Nothing) As Task(Of String)
            Try
                ' 拼接查询参数
                Dim requestUrl As String = baseUrl
                If parameters IsNot Nothing AndAlso parameters.Count > 0 Then
                    Dim queryBuilder As New StringBuilder()
                    For Each pair In parameters
                        queryBuilder.Append($"{Uri.EscapeDataString(pair.Key)}={Uri.EscapeDataString(pair.Value)}&")
                    Next
                    Dim query As String = queryBuilder.ToString().TrimEnd("&"c)
                    requestUrl &= If(requestUrl.Contains("?"), "&", "?") & query
                End If
    
                ' 发送GET请求并验证状态码
                Dim response As HttpResponseMessage = Await _httpClient.GetAsync(requestUrl)
                response.EnsureSuccessStatusCode()
    
                ' 读取响应并格式化JSON
                Dim responseJson As String = Await response.Content.ReadAsStringAsync()
                Return FormatJsonString(responseJson)
            Catch ex As HttpRequestException
                Throw New Exception($"GET请求失败:{ex.Message}", ex)
            End Try
        End Function
    
        ''' 
        ''' 发送POST请求(JSON格式请求体)
        ''' 
        ''' 请求体数据类型
        ''' 接口完整地址
        ''' 请求体数据(任意可序列化对象)
        ''' 格式化后的JSON响应字符串
        Public Shared Async Function SendPostJsonRequestAsync(Of T)(apiUrl As String, requestData As T) As Task(Of String)
            Try
                ' 将对象序列化为JSON字符串
                Dim jsonBody As String = JsonSerializer.Serialize(requestData, New JsonSerializerOptions With {.WriteIndented = False})
                ' 构造JSON请求体
                Dim content As New StringContent(jsonBody, Encoding.UTF8, "application/json")
    
                ' 发送POST请求并验证状态码
                Dim response As HttpResponseMessage = Await _httpClient.PostAsync(apiUrl, content)
                response.EnsureSuccessStatusCode()
    
                ' 读取响应并格式化JSON
                Dim responseJson As String = Await response.Content.ReadAsStringAsync()
                Return FormatJsonString(responseJson)
            Catch ex As HttpRequestException
                Throw New Exception($"POST请求失败:{ex.Message}", ex)
            End Try
        End Function
    
        ''' 
        ''' 添加全局请求头(如Token、API Key)
        ''' 
        ''' 请求头名称
        ''' 请求头值
        Public Shared Sub AddGlobalHeader(headerName As String, headerValue As String)
            If Not _httpClient.DefaultRequestHeaders.Contains(headerName) Then
                _httpClient.DefaultRequestHeaders.Add(headerName, headerValue)
            End If
        End Sub
    
        ''' 
        ''' 格式化JSON字符串,提升可读性
        ''' 
        ''' 原始JSON字符串
        ''' 格式化后的JSON
        Private Shared Function FormatJsonString(rawJson As String) As String
            If String.IsNullOrEmpty(rawJson) Then Return rawJson
            Dim jsonDoc As JsonDocument = JsonDocument.Parse(rawJson)
            Return JsonSerializer.Serialize(jsonDoc, New JsonSerializerOptions With {.WriteIndented = True})
        End Function
    End Class
    
    ''' 
    ''' 测试程序入口,演示GET/POST请求的使用
    ''' 
    Module Program
        ' VB.NET主函数,异步执行测试逻辑
        Sub Main()
            ' 同步等待异步方法执行(控制台程序专用)
            TestApiRequestsAsync().GetAwaiter().GetResult()
            ' 防止控制台立即关闭
            Console.WriteLine(vbCrLf & "按任意键退出程序...")
            Console.ReadKey()
        End Sub
    
        ''' 
        ''' 测试GET和POST API请求
        ''' 
        Private Async Function TestApiRequestsAsync() As Task
            Try
                ' 可选:添加全局请求头(如Token认证)
                ' HttpHelper.AddGlobalHeader("Authorization", "Bearer your_token_here")
                ' HttpHelper.AddGlobalHeader("X-API-Key", "your_api_key_here")
    
                ' ------------------- 测试GET请求 -------------------
                Console.WriteLine("=== 开始执行GET请求 ===")
                Dim getUrl As String = "https://api.example.com/user/list" ' 替换为实际接口地址
                Dim getParams As New Dictionary(Of String, String) From {
                    {"page", "1"},
                    {"size", "10"},
                    {"keyword", "vb.net_test"}
                }
                Dim getResponse As String = Await HttpHelper.SendGetRequestAsync(getUrl, getParams)
                Console.WriteLine("GET请求响应结果:" & vbCrLf & getResponse)
    
                Console.WriteLine("------------------------")
    
                ' ------------------- 测试POST请求 -------------------
                Console.WriteLine("=== 开始执行POST请求 ===")
                Dim postUrl As String = "https://api.example.com/user/login" ' 替换为实际接口地址
                ' 匿名类型请求体(也可替换为自定义实体类)
                Dim postData = New With {
                    .username = "vbnet_admin",
                    .password = "123456_test",
                    .rememberMe = True
                }
                Dim postResponse As String = Await HttpHelper.SendPostJsonRequestAsync(postUrl, postData)
                Console.WriteLine("POST请求响应结果:" & vbCrLf & postResponse)
    
            Catch ex As Exception
                Console.WriteLine($"请求异常:{ex.Message}")
                If ex.InnerException IsNot Nothing Then
                    Console.WriteLine($"内部异常详情:{ex.InnerException.Message}")
                End If
            End Try
        End Function
    End Module
    
    
    本工具支持 API 接口的实时请求测试,实时返回接口响应结果,助力开发者快速排查接口问题。
    ⚠️ 本工具为真实请求,将消耗额度 / 产生计费,请勿填写私密信息。
    ⚠️ 本页面工具将自动添加请求头,无需手动添加。
    请求参数
    参数名 参数值 操作

    仅需三步即可快速接入

    1
    注册认证 · 获取密钥

    注册开发者账号并完成实名认证,在 控制台 申请专属API密钥(支持多种安全认证策略)。

    2
    接口调试 · 开发集成

    使用平台 在线调试工具 快速验证接口,通过官方API文档完成业务系统的接口集成与联调。

    3
    生产上线 · 监控运维

    在生产环境调用接口,然后在 个人中心 查看调用日志、平台提供弹性配额与故障排查支持。