文档中心

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

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

产品目录

知乎热榜Top50实时获取

服务正常 全站会员免费包年包月按量计费次数包 社交平台工具 2026-02-25 10 万次

实时获取知乎热榜前50条热门话题,包含标题、摘要和热度值。掌握全网热点动态,快速了解当下最受关注的社会话题和讨论焦点。

调用权限
正常
请求频率限制
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/zhut/index

    返回格式: application/json

    请求方式: HTTPGET

    请求HEADER:

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

    请求参数说明:

    名称必填类型示例值说明
    key是string35kj5jnlj53453kl5j43nj5接口密钥,在控制台->密钥管理查看

    返回参数说明:

    名称类型说明
    codestring状态码,200表示成功
    daystring当前日期,格式:YYYY年MM月DD日
    fresh_textstring数据更新时间描述
    Top_1 ~ Top_50object热榜第1~50条数据
    Top_N.titlestring话题标题
    Top_N.excerptstring话题摘要/简介
    Top_N.hotstring热度值,如"1234 万热度"

    免责声明:

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

    请求示例:

    https://www.ninyao.cn/api/zhut/index?key=你的密钥

    返回示例:

    {"code": "200","day": "2026年02月25日","fresh_text": "热榜已更新","Top_1": {"title": "新年BBA车价大降,宝马 7 系降价约 27 万,曾经加价提车的BBA,如今为何要靠「骨折价」抢市场?","excerpt": "近日,记者走访发现,春节期间看车选车的市民不在少数。尤其在豪华品牌燃油车市场,受国补、厂补等因素推动,优惠降价促销仍是主旋律。值得注意的是,BBA等豪华品牌的促销并非针对春节。记者发现,大多数4S店的优惠政策在节前就已释放。 奔驰方面,多家奔驰4S店E级多款车型优惠高达11万元,最高优惠高达13.5万,其中2026款E 260 L经典版优惠后价格为31.99万元(指导价42.99万元)。奔驰GLB最高优惠额度达12.9万元,最低起售价格已降至14.49万元。 宝马方面,蓝鲸记者从门店销售处获得一张报价单,数据显示,宝马530Li尊享型指导价52.5万元,终端实际售价35.7万元,优惠高达16万元,价格降幅超30%。宝马7系优惠最高达27万。 奥迪方面,奥迪A6L 2026款40 TFSI豪华动感型优惠高达15.1万元,优惠后价格为27.69万元(指导价42.79万元);奥迪A7L直降18.72万元,2025款55 TFSI quattro RS套件竞速版从66.62万元降至47.90万元;飞驰人生的原型车奥迪A3,在一些门店更是低至10万元。新年BBA车价大降:宝马7系降价约27万元","hot": "410 万热度"},"Top_2": {"title": "尼格买提晒家宴,8 个菜没有一片绿叶,网友调侃「碳水盛宴」,新疆人真的不爱吃蔬菜吗?为什么?","excerpt": "近日,知名主持人尼格买提发布视频,展示了新疆家宴菜系,包括炒拉条、烤羊腱子、烤羊肉串、黄面、凉粉等等。 全桌以牛羊肉和主食为主,未见绿叶蔬菜,被网友调侃为“碳水盛宴”。 新疆本地网友纷纷表示,这是家常宴客的典型配置。 主持人尼格买提晒新疆家宴,8个菜全是肉和主食,没有一片绿叶!网友笑称“碳水盛宴”_腾讯新闻","hot": "281 万热度"},"Top_3": {"title": "华为 2025 年销售收入超过 8800 亿元,如何解读此业绩?2026 年能破万亿吗?","excerpt": "2月24日上午,马年开工首日,华为董事长梁华在2026广东省高质量发展大会上发表讲话时透露,2025年华为公司销售收入超过8800亿元人民币。梁华表示,2025年,公司持续做强核心竞争力,战略聚焦;坚持走高质量发展道路,以质取胜;努力为全球客户提供有竞争力的产品和服务,公司整体经营稳健。华为2025年销售收入超过8800亿元人民币","hot": "254 万热度"},"Top_4": {"title": "女生西藏徒步时失联,用牛粪保温在牛棚被找到,为啥牛粪能帮助维持体温?这种情况还能做哪些保护措施?","excerpt": "2月22日,一女生在西藏山南市库拉岗日徒步时失联引发关注。2月24日上午,潇湘晨报记者从当地乡政府和参与救援人员处获悉,该女生已在23日获救,于一牛棚处被救援人员找到。 事发地措玉村一家民宿老板告诉潇湘晨报记者,山上没有信号,村里通常会收上山游客的身份证,下山后游客再来领。 22日那天山上突然下起大雪,“她是跟团上去的。领队们看见下雪就往下撤,她走错路了。”该老板称,下雪后山上能见度很低,女生可能是在下撤过程中走散并走反了方向,走去了山上,领队们在山上找过,但没有找到人。当晚7时许,这名女生仍没有出现领身份证,村里便连忙召集人上山,在当晚、23日凌晨分别去了好几批人,连夜展开搜寻。 △ 上山救援的人群,受访者供图 另一名参与救援的人员也发帖分享,从22日晚上陆续有多批人上山帮忙搜寻,不少村民、民警还有摔伤。直到23日中午,传来了该女生被找到的消息。 “她很厉害,不是新手,有保护自己的观念,不然会很危险。”民宿老板称,失联女生是在一牛棚处被找到,里面有牛粪,可以帮助维持体温。女生被找到时身体状态尚好。 △ 上山救援的人群,受访者供图 参与救援的人员称,网上有些舆论发酵,包括自己最初也因封山没能赶上白雪晴空的库拉岗日而有些怨言,但后来自己从上山搜寻的村民处得知,大雪天气山上其实非常危险,女生发现牛棚后,有意识地把牛粪堵住牛棚封口,用卫生巾裹住脚等,做了一系列保护措施;女生也发现了搜救人员并有回应,但是天气原因未被发现,通宵等待救援,在天亮时还幸运地看到了日照金山。 “她就是恶劣天气走散了,靠冷静智慧拯救了自己,我们参与的都完全不敢想这种环境能活下来。”该救援人员称,女生其实也比较自责,只是在镜头前用笑容面对大家,此外,女生报团的旅游公司和女生自己也承担了救援所需要的费用。 △ 被救女生和救援人员,图源网络 事发地色乡乡政府工作人员也向潇湘晨报记者表示,该女生失联后,当地多部门联合搜救,女生已在23日被找到,人没事。考虑到大雪天气,为保障游客安全,当地对库拉岗日进行了封山,24日已可以正常上山。 据工作人员了解,女生方基本承担了上山村民的搜救费用,“详细是他们自己和救援村民对接,我们也不太了解具体情况。” 库拉岗日一女生徒步失联1日在牛棚被找到,当地:她用牛粪保温,基本承担了村民救援费_腾讯新闻","hot": "237 万热度"},"Top_5": {"title": "《西游记》中,菩提祖师赶走孙悟空时,为何表现得近乎“绝情”?","excerpt": "","hot": "228 万热度"},"Top_6": {"title": "如何评价入伍十年27岁飞行员飞行时长超过1000小时,远高于同年龄段飞行员?","excerpt": "入伍 10 年,1999 年出生的金力嘉,飞行时长已超过 1000 小时,远高于同年龄段飞行员。","hot": "220 万热度"},"Top_7": {"title": "误转 69 万公款对方拒绝退款,报警后追回,大额转账转错人该怎么办?若公款无法追回个人应如何承担责任?","excerpt": "“发现69万元转错的那一刻,我感觉天塌下来了!”近日,苏州工业园区一公司人力资源从业人员李女士,在年关将至的忙碌中因疏忽操作,将公司一笔69万元的款项,误转给曾与她有过房屋租赁往来的云南租客。 事忙手误,69万元公款“错付千里” “年关将至,工作多,我同时处理多笔转账,忙中出错了!”1月29日,李女士告诉扬子晚报/紫牛新闻记者,作为公司人力专员,她负责薪资及各类款项划转,转账当日核对信息时,误将本应转入公司指定账户的69万元,填成了曾与她有过房屋租赁往来的一名云南租客,“他退租时我退过押金,账号存着没删,工作太多太匆忙,核对时产生了失误。” 李女士表示,发现这笔“错款”转账成功后,她第一时间联系对方,起初对方答应退款,可没过多久突然变卦。“对方改口说必须云南昆明当地派出所通知他,才肯转钱。”李女士急得眼眶发红,“他临时反悔,我这下彻底慌了。” 针对收款方的临时变卦,李女士立刻联系开户行申请冻结对方账户,却被银行工作人员告知,银行无法自行冻结他人账户。“经理告诉我,对方能每次取5000元,也能凭身份证调额全额取出。钱暂时还在,但风险太大,就怕他随时转走。” “69万元,不是私房钱,而是公司公款。若追不回,不仅饭碗难保,还可能面临追偿责任。”李女士说。女子误转69万元公款,对方拒绝退款!警方介入,收款人:你们管得着吗_腾讯新闻","hot": "217 万热度"},"Top_8": {"title": "巴拿马政府强行接管李嘉诚旗下港口,长和回应「相关行动不合法」,如何解读?是否违背了国际贸易基本规则?","excerpt": "2月24日,据香港特区新闻公报,香港特区商务及经济发展局局长丘应桦向巴拿马驻港总领事提出严正抗议。 香港特区政府对巴拿马政府昨日强行接管和记港口巴拿马港口公司经营的两个巴拿马港口并撤销经营权、破坏合约精神,表达强烈不满和反对,并强调会坚定支持和维护香港企业在海外的合法权益。 特区政府重申,巴拿马最高法院早前裁定该公司经营的两个巴拿马港口违宪一事,完全是罔顾事实、背信弃义。相关公司已提出并启动仲裁程序,但巴拿马政府昨日强行接管两个港口,严重损害香港企业的合法权益和违反合约精神。特区政府对此粗暴行径予以谴责。 特区政府再次敦促巴拿马政府尊重合约精神,为当地依法营运的企业提供公平、公正的营商环境,确保企业的合法权益不受干预。香港企业在巴拿马经营和投资,应获公平合理的待遇和保障。 特区政府强调,相关公司多年来在当地投入巨额投资和创造大量职位,有关裁决及巴拿马政府的无理行为自毁国家信用,严重破坏国际贸易规则。 2月24日,李嘉诚旗下长和在官网发布公告称,2026年2月24日,长江和记实业有限公司(“长江和记”)获悉,于巴拿马时间2026年2月23日,巴拿马共和国(“巴拿马政府”)强行进入由长江和记之附属公司巴拿马港口公司所运营的巴尔博亚港和克里斯托瓦尔港两个集装箱码头,并且接管两个集装箱码头的行政及运营控制权,同时禁止巴拿马港口公司之代表进入该两个集装箱码头。 长江和记重申,相关裁决、巴拿马总统颁布的行政法令、撤销巴拿马港口公司之特许经营权,以及强行接管两个集装箱码头,属不合法。巴拿马政府此等行动,亦对巴尔博亚港和克里斯托瓦尔港两个集装箱码头的运营、卫生与安全构成严重风险。巴拿马政府此前并无就有关行动知会巴拿马港口公司,亦无与巴拿马港口公司协商。巴拿马政府须就其所采取的强行没收行动而引致之一切损害及损失承担责任。https://www.nbd.com.cn/articles/2026-02-24/4266937.html","hot": "202 万热度"},"Top_9": {"title": "专家称未来 10 年机器人数量会超过人类数量,人们一周只需工作 2 天,是这样吗?有哪些证据支撑?","excerpt": "清华大学智能产业研究院院长 张亚勤:未来一周只需工作2天,工资不会减少甚至还会变高,未来10年机器人数量会超过人类数量 张亚勤:未来一周只需工作2天,工资不会减少甚至还会变高,未来10年机器人数量会超过人类数量","hot": "202 万热度"},"Top_10": {"title": "《夜王》已经全国范围上映,如果你去看了,实话说值不值得买票去看?","excerpt": "看了的朋友来说说你的真实观感,看预告片好多香艳画面,蛮想去看看的。","hot": "201 万热度"},"Top_11": {"title": "韩寒透露《飞驰人生 4》计划,你期待看到怎样的故事?","excerpt": "韩寒在《飞驰人生 3》路演中透露飞驰人生将有第四部,针对主持人提问:林臻东和李伦到底谁家底更厚一点?韩寒回答称,在4中即将揭晓。","hot": "175 万热度"},"Top_12": {"title": "如果韦小宝落难,最先离开的是他哪个老婆?","excerpt": "如题,可以参考原著及电视剧。","hot": "144 万热度"},"Top_13": {"title": "如何看待这种把教科书中的关键信息删除,让学生填空教科书的行为?这样的教学行为会造成什么不良影响?","excerpt": "如下图: 这是否是在无端人为制造阅读障碍,降低学习效率?是否会使学生养成不良的阅读习惯?","hot": "135 万热度"},"Top_14": {"title": "为何《飞驰人生 3》能在两年以内完成制作并上映,而《哪吒》等其他电影的第三部却需要三年以上?","excerpt": "都是系列第三部,为什么《哪吒》、《疯狂动物城》等一些系列电影的第三部要三年以上时间才可以完成?","hot": "125 万热度"},"Top_15": {"title": "如何评价电影《飞驰人生》两部曲中尹正饰演的孙宇强?","excerpt": "孙宇强是个什么样的人?现实中有这种朋友吗?","hot": "119 万热度"},"Top_16": {"title": "如何评价起点万订作者过年回家被母亲批评不务正业,要求其进厂打工?起点万订属于什么水平?能养活自己吗?","excerpt": "起点万订作者吴三醒回老家过年的时候,被父母劝说放弃网文写作,最终被安排进入工厂打工。 吴三醒是起点的奥特曼同人文作者,代表作是《迪迦:从哥尔赞开始的无限进化》,这本小说是实打实的有万订徽章,简单来说就是要做到平均有超过一万名付费读者全部订阅这个小说才能拥有这个徽章。 根据这个作者在他的新书《奥特:徒手搓光?这光有毒!》最新章节中透露,矛盾从过年前一天开始爆发的,并且一直持续到春节期间。作者母亲认为“一直做这个(写小说),我儿子以后都会看不起我”,坚持要求他放弃网文创作,进工厂打工,作者本人也是比较无奈。 心力交瘁之下,作者最终选择妥协。他在单章的后半段中写道:“从几年前我老婆第一次去我家的时候,就让我老婆劝我进厂打工,现在算是如他们所愿了,明天出发,初七上工。以后就偶尔更新吧,唉。”也就是说今天初七估计已经开始进工厂打工了。 根据能看到的数据显示,吴三醒的起点作者等级是LV4,这意味着他最近12个月的稿费收入在5万到15万之间,因为我记得LV5的标准是年稿费15万以上。所以说实际上他在起点的总收入应该没有超过15万,不然应该会晋升LV5。这和正常万订作者应有的收入水平存在明显差距,主要的原因就是因为他万订的那本小说字数比较少,只有90多万字,而且在完结的时候均订已经掉到8千了,他的小说全订需要35块,8000乘35再乘0.5算下来就是十三四万左右。而他其他的两本书都是新书没有撑到上架,所以一毛钱都没挣到。所以说他在起点的总稿费应该就是14万左右。年入十几万不如流水线 起点万订作者被父母要求进厂","hot": "111 万热度"},"Top_17": {"title": "为什么我们在游戏里连5分钟对话都嫌长,却对着影视博主的万字剧情考据看得津津有味?","excerpt": "","hot": "111 万热度"},"Top_18": {"title": "如何看待广州、杭州多地发布学位预警?学位紧张该如何缓解?","excerpt": "2026年义务教育阶段招生工作尚未正式启动,多地再度发布学位预警通知。 根据教育部的信息,小学学龄人口已在2023年达峰,而初中学龄人口高峰则预计在2026年到来。相较往年学位预警主要集中在小学阶段,今年学位预警开始呈现向初中阶段传导的特征。 据财新不完全统计,2025年底以来,广州、杭州、西安、东莞等多个城市密集发布中小学学位预警。多地接连发布中小学学位预警|教育观察","hot": "110 万热度"},"Top_19": {"title": "我感觉为什么这几年全世界的编剧都不会写反派了?","excerpt": "无论是日漫美漫还是国漫,电影电视剧,各种作品里的反派不是无能狂怒的糖狮就是被迫作恶的“好人”(有些时候是编剧认为的) 真正豪情万丈野心勃勃,立场为反派但胸怀大志心比天高的反派几乎看不见了。。。","hot": "95 万热度"},"Top_20": {"title": "如何评价《原神》角色预告—「法尔伽:骑士精神」?","excerpt": "是骑士精神决定了他应该有的样子,还是成为骑士的人决定这个身份应当有的面貌? 法尔伽应该不会花费太多时间思考这个问题,自由的风总是不停歇,他的随心所欲也是。","hot": "80 万热度"},"Top_21": {"title": "上海发布楼市「沪七条」,符合条件非沪籍居民可在外环内增购 1 套住房,对房地产市场有何影响?","excerpt": "为更好满足居民刚性和改善性住房需求,促进房地产市场平稳健康发展,2月25日,上海市住房城乡建设管理委、市房屋管理局、市财政局、市税务局、市公积金管理中心等五部门联合印发《关于进一步优化调整本市房地产政策的通知》(以下简称《通知》),自2026年2月26日起施行。符合条件非沪籍居民可在外环内增购1套住房 上海发布楼市“沪七条”","hot": "77 万热度"},"Top_22": {"title": "为什么美国花滑主力基本上都是华裔,但中国花滑男女单的成绩却很一般?","excerpt": "[图片]","hot": "75 万热度"},"Top_23": {"title": "沈逸教授探讨当代间谍,国安部警示评论区存在「谍影重重」,普通人该如何防范?","excerpt": "","hot": "71 万热度"},"Top_24": {"title": "能从底层解释一下计算机的原理吗?","excerpt": "计算机是由存储器 CPU 输入设备 输出设备组成。就CPU而言,CPU是计算机的核心部件,负责执行指令和进行算术逻辑运算,由控制单元、算术逻辑单元和寄存器等组成。 可是总觉得学了这些还是一脸蒙,感觉就是学了一堆名词…","hot": "66 万热度"},"Top_25": {"title": "OpenClaw,到底能做什么呢?","excerpt": "OpenClaw,到底能做什么呢?哪些Skills是值得用的","hot": "59 万热度"},"Top_26": {"title": "如何最简单、通俗地理解Pytorch?","excerpt": "","hot": "59 万热度"},"Top_27": {"title": "到底怎么才能稳定交易心态?","excerpt": "是对自己的充满无限自信吗?可每次累计自信达到高潮就会被干废,然后一蹶不振,开始怀疑自己,好久才能恢复,然后高潮。。。明知道自己的策略是没什么问题的,在低谷期稍微浮亏就会疑神疑鬼,不打止损就手动平仓,然后就按预计的方向前进,在信心指数上升趋势就不会有这种心态,很绝望,不知道要如何锻炼自己的心态,请求各位大佬指点迷津","hot": "59 万热度"},"Top_28": {"title": "如何看待 T1 不敌 DK 后 LCK 决赛二手门票暴跌?","excerpt": "T1不敌DK后,LCK杯决赛二手门票价格暴跌。 t1不敌dk后,lck杯决赛二手门票价格暴跌","hot": "59 万热度"},"Top_29": {"title": "正午阳光出品的电视剧《生命树》有哪些看点?","excerpt": "","hot": "58 万热度"},"Top_30": {"title": "是不是棒球棒这种类似结构的兵器在练家子手里并不好用?","excerpt": "刚刷到一个棒球推广问题的帖子,结果大多数答棒球棒攻击性的答案为什么棒球在我国毫无水花? 这种棒球棒结构的兵器是不是小白用着好用,但练过兵器的人手里就不好用了?但世界兵器上的反曲刀,狗头刀那种又很多。 不过,像战锤和战斧算这种结构吗?似乎这俩只是针对战场上的破甲,不是戚继光所谓的民间械斗的“游场”那种。","hot": "58 万热度"},"Top_31": {"title": null,"excerpt": null,"hot": null},"Top_32": {"title": null,"excerpt": null,"hot": null},"Top_33": {"title": null,"excerpt": null,"hot": null},"Top_34": {"title": null,"excerpt": null,"hot": null},"Top_35": {"title": null,"excerpt": null,"hot": null},"Top_36": {"title": null,"excerpt": null,"hot": null},"Top_37": {"title": null,"excerpt": null,"hot": null},"Top_38": {"title": null,"excerpt": null,"hot": null},"Top_39": {"title": null,"excerpt": null,"hot": null},"Top_40": {"title": null,"excerpt": null,"hot": null},"Top_41": {"title": null,"excerpt": null,"hot": null},"Top_42": {"title": null,"excerpt": null,"hot": null},"Top_43": {"title": null,"excerpt": null,"hot": null},"Top_44": {"title": null,"excerpt": null,"hot": null},"Top_45": {"title": null,"excerpt": null,"hot": null},"Top_46": {"title": null,"excerpt": null,"hot": null},"Top_47": {"title": null,"excerpt": null,"hot": null},"Top_48": {"title": null,"excerpt": null,"hot": null},"Top_49": {"title": null,"excerpt": null,"hot": null},"Top_50": {"title": null,"excerpt": null,"hot": null}}
    错误码类型说明
    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/zhut/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
    生产上线 · 监控运维

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