文档中心

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

宝宝起名v2

服务正常 次数包 优质接口 2024-10-05 5085 次

查询异步任务执行状态,获取任务处理结果,支持多种异步处理场景。

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

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

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

次数包:

额度 价格 有效期
1000 (次) ¥ 15 低至0.015/次 一年
5000 (次) ¥ 70 低至0.014/次 一年
10000 (次) ¥ 130 低至0.013/次 一年
50000 (次) ¥ 600 低至0.012/次 一年
100000 (次) ¥ 998 低至0.00998/次 一年

免费额度:

总免费额度 每月免费额度 每日免费额度
5 (次) 5 (次) 包含在总免费额度 5 (次) 包含在总免费额度

请求限制:

免费/测试用户请求频率限制 请求频率总限制 每日请求次数总限制
3秒1次 每个免费用户的QPS总限制 1秒10次 每个用户QPS总限制 不限 每个用户每日请求总次数

其他准入要求:

接口地址: https://qqlykm.cn/api/qiming/index

返回格式: application/json

请求方式: HTTPGET

请求示例: 请仔细查看以下接口文档再请求

请求HEADER:

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

请求参数说明:

名称必填类型示例值说明
keystring35kj5jnlj53接口密钥,在控制台->密钥管理查看
surnamestring姓氏,支持复姓
sexstring2性别参数,男为1,2为女
birthdaystring2024-10-05 11:02:03出生时间, 请按照示例值的格式请求
typestring2
单字名或双字名, 单字为1, 双字为2
name
string淑可
名字, 传递此参数可查询八字等信息
quantitystring
30起名返回数量控制, 最少5, 最多30

此接口与在线起名v1接口不同的是:本接口birthday参数可精确到时分秒,词库也更大,相对v1接口返回的名字会更好听,可控制起名返回的数量,查询八字等信息也更全。

详细请看请求示例(女名):

起名:?surname=董&sex=2&birthday=2024-10-03 05:06:00&type=2(surname参数支持复姓起名, 如 欧阳)

查询八字信息:?surname=董&name=淑可&birthday=2024-10-03 05:06:00

控制起名返回的数量:?surname=董&sex=2&birthday=2024-10-03 05:06:00&type=2&quantity=5(quantity参数非必填,每次请求可最低5个名字,最多30个名字,不填此参数默认返回30个名字)

请按照示例请求即可,birthday参数请严格按照示例的格式传参,否则会报错。

本接口采用次数包方式,成功返回结果 才会扣费,失败不计费。

起名返回参数说明:

名称类型说明
codeint状态码
msgstring状态信息
datastring请求结果数据集

查询八字返回参数说明:

名称类型说明
codeint状态码
msgstring状态信息
datastring请求结果数据集
data.birthdaystring
出生时间
data.name.surnamestring姓氏
data.name.combinestring名字
data.name.surname_pinyinstring姓氏的拼音
data.name.surname_wuxingstring姓氏的五行属性
data.name.surname_bihuastring姓氏的笔画数
data.name.surname_bihua_jianstring姓氏的简体笔画数
data.name.surname_bushoustring姓氏的部首
data.name.combine_char1string名字的第一个字
data.name.combine_char1_pinyinstring名字第一个字的拼音
data.name.combine_char1_wuxingstring名字第一个字的五行属性
data.name.combine_char1_bihuastring名字第一个字的笔画数
data.name.combine_char1_bihua_jianstring名字第一个字的简体笔画数
data.name.combine_char1_bushoustring名字第一个字的部首
data.name.combine_char1_descriptionstring名字第一个字的详细描述
data.name.combine_char2string名字的第二个字
data.name.combine_char2_pinyinstring名字第二个字的拼音
data.name.combine_char2_wuxingstring名字第二个字的五行属性
data.name.combine_char2_bihuastring名字第二个字的笔画数
data.name.combine_char2_bihua_jianstring名字第二个字的简体笔画数
data.name.combine_char2_bushoustring名字第二个字的部首
data.name.combine_char2_descriptionstring名字第二个字的详细描述
data.ming_li.paipan_result.lunar_yearstring排盘结果-农历年份
data.ming_li.paipan_result.lunar_monthstring排盘结果-农历月份
data.ming_li.paipan_result.lunar_daystring排盘结果-农历日期
data.ming_li.paipan_result.lunar_hourstring排盘结果-农历时辰
data.ming_li.paipan_result.lunar_year_chinesestring排盘结果-农历年份的中文表示
data.ming_li.paipan_result.lunar_month_chinesestring排盘结果-农历月份的中文表示
data.ming_li.paipan_result.lunar_day_chinesestring排盘结果-农历日期的中文表示
data.ming_li.paipan_result.lunar_hour_chinesestring排盘结果-农历时辰的中文表示
data.ming_li.paipan_result.ganzhi_yearstring排盘结果-干支年份
data.ming_li.paipan_result.ganzhi_monthstring排盘结果-干支月份
data.ming_li.paipan_result.ganzhi_daystring排盘结果-干支日期
data.ming_li.paipan_result.ganzhi_hourstring排盘结果-干支时辰
data.ming_li.paipan_result.animalstring排盘结果-生肖
data.ming_li.paipan_result.termstring排盘结果-节气
data.ming_li.paipan_result.is_leapstring排盘结果-是否为闰月
data.ming_li.paipan_result.gregorian_yearstring排盘结果-公历年份
data.ming_li.paipan_result.gregorian_monthstring排盘结果-公历月份
data.ming_li.paipan_result.gregorian_daystring排盘结果-公历日期
data.ming_li.paipan_result.gregorian_hourstring排盘结果-公历时辰
data.ming_li.paipan_result.week_numstring排盘结果-星期几的数字表示
data.ming_li.paipan_result.week_namestring排盘结果-星期几的中文表示
data.ming_li.paipan_result.is_todaystring排盘结果-是否为今天
data.ming_li.paipan_result.constellationstring排盘结果-星座
data.ming_li.paipan_result.ganshen_arrstring排盘结果-干神
data.ming_li.paipan_result.cang_gan_arrstring排盘结果-藏干
data.ming_li.paipan_result.ganzhi_shen_arrstring排盘结果-干支神
data.ming_li.wuxing_strength.wood_strengthstring五行强度-木的强度
data.ming_li.wuxing_strength.fire_strengthstring五行强度-火的强度
data.ming_li.wuxing_strength.earth_strengthstring五行强度-土的强度
data.ming_li.wuxing_strength.gold_strengthstring五行强度-金的强度
data.ming_li.wuxing_strength.water_strengthstring五行强度-水的强度
data.ming_li.wuxing_strength.yue_zhi_strengtharray五行强度-月支强度
data.ming_li.wuxing_strength.similararray五行强度-相似的五行
data.ming_li.wuxing_suitable
五行适宜分析
data.ming_li.wuxing_suitable.yong_shenstring用神
data.ming_li.wuxing_suitable.xi_shenstring喜神
data.ming_li.wuxing_suitable.ji_shenstring忌神
data.ming_li.wuxing_suitable.chou_shenstring仇神
data.ming_li.wuxing_suitable.suggeststring建议
data.ming_li.dishi
地势地支
data.ming_li.dishi.nianstring年柱
data.ming_li.dishi.yuestring月柱
data.ming_li.dishi.ristring日柱
data.ming_li.dishi.shistring时柱
data.ming_li.nayin
纳音分析
data.ming_li.nayin.nianstring年柱纳音
data.ming_li.nayin.yuestring月柱纳音
data.ming_li.nayin.ristring日柱纳音
data.ming_li.nayin.shistring时柱纳音
data.ming_li.xunkong
旬空分析
data.ming_li.xunkong.nianstring年旬空
data.ming_li.xunkong.yuestring月旬空
data.ming_li.xunkong.ristring日旬空
data.ming_li.xunkong.shistring时旬空
data.ming_li.char1_wuxing_analysestring名字第一个字的五行分析
data.ming_li.char2_wuxing_analysestring名字第二个字的五行分析
data.ming_li.combine_wuxing_analysestring名字组合的五行分析
data.ming_li.sancai_analyse
命理三才分析
data.ming_li.sancai_analyse.namestring三才名称
data.ming_li.sancai_analyse.scorestring三才评分
data.ming_li.sancai_analyse.levelstring三才等级
data.ming_li.sancai_analyse.caiyunstring财运
data.ming_li.sancai_analyse.gaishustring概述
data.ming_li.sancai_analyse.jiankangstring健康
data.ming_li.sancai_analyse.jiatingstring家庭
data.ming_li.sancai_analyse.shiyestring事业
data.ming_li.sancai_analyse.xinggestring性格
data.score
评分信息
data.score.wenhuanumber文化评分
data.score.ming_linumber命理评分
data.score.sheng_xiaonumber生肖评分
data.score.wu_genumber五格评分
data.score.overallnumber总评分
data.wenhua
名字文化分析
data.wenhua.yin_lvstring名字音律分析
data.wenhua.zi_xingstring名字字形分析
data.wenhua.char_idiom_arrstring名字相关的成语词语
data.wenhua.description_strstring名字相关的成语词语解释
data.wenhua.descriptionstring名字相关的成语词语解释
data.sheng_xiao
生肖分析
data.sheng_xiao.relation_descriptionstring生肖关系分析
data.sheng_xiao.suitable_bushoustring生肖适合的部首
data.wu_ge
五格分析
data.wu_ge.tian_ge
天格分析
data.wu_ge.ren_ge
人格分析
data.wu_ge.di_ge
地格分析
data.wu_ge.wai_ge
外格分析
data.wu_ge.zong_ge
总格分析
data.xxx_ge.meanstring五格-含义
data.xxx_ge.descriptionstring五格-描述
data.xxx_ge.ji_xiongstring五格-吉凶
data.xxx_ge.explainstring五格-解释

返回示例:

起名示例返回:

{

    "code": 200,

    "msg": "获取成功",

    "data": {

        "surname": "董",

        "sex": "2",

        "birthday": "2024-10-03 05:06:00",

        "type": "2",

        "list": [

            {

                "name": "益君"

            },

            {

                "name": "凌曦"

            },

            {

                "name": "宜静"

            },

            {

                "name": "依云"

            },

            {

                "name": "若晞"

            },

            {

                "name": "欣予"

            },

            {

                "name": "泽沐"

            },

            {

                "name": "雨梦"

            },

            {

                "name": "霁月"

            },

            {

                "name": "羽童"

            },

            {

                "name": "予兮"

            },

            {

                "name": "思渝"

            },

            {

                "name": "梦桐"

            },

            {

                "name": "佳菲"

            },

            {

                "name": "玉麒"

            },

            {

                "name": "淑可"

            },

            {

                "name": "楚晴"

            },

            {

                "name": "悦宸"

            },

            {

                "name": "雅涵"

            },

            {

                "name": "语兮"

            },

            {

                "name": "若诗"

            }

        ]

    },

    "text": {

        "copyright": "公共API https://qqlykm.cn"

    }

}

八字查询示例返回:

{
   "code": 200,
   "msg": "获取成功",
   "data": {
       "birthday": "2024-10-03 05:06:00",
       "name": {
           "surname": "董",
           "combine": "淑可",
           "surname_pinyin": "dǒng",
           "surname_wuxing": "木",
           "surname_bihua": "15",
           "surname_bihua_jian": "12",
           "surname_bushou": "艹",
           "combine_char1": "淑",
           "combine_char1_pinyin": "shū",
           "combine_char1_wuxing": "水",
           "combine_char1_bihua": "12",
           "combine_char1_bihua_jian": "11",
           "combine_char1_bushou": "氵",
           "combine_char1_description": "淑字的本义是指流水清澈,后来也指女性的外表美丽,心地善良。",
           "combine_char2": "可",
           "combine_char2_pinyin": "kě",
           "combine_char2_wuxing": "木",
           "combine_char2_bihua": "5",
           "combine_char2_bihua_jian": "5",
           "combine_char2_bushou": "口",
           "combine_char2_description": "五行为木、火,本义为唱,引申为许可、同意、准许等义。在人名用字中一般有适合、美好等含义,同时也为助字,起强调另外一个字的作用。"
       },
       "ming_li": {
           "paipan_result": {
               "lunar_year": "2024",
               "lunar_month": "09",
               "lunar_day": "01",
               "lunar_hour": "05",
               "lunar_year_chinese": "二零二四",
               "lunar_month_chinese": "九月",
               "lunar_day_chinese": "初一",
               "lunar_hour_chinese": "卯时",
               "ganzhi_year": "甲辰",
               "ganzhi_month": "癸酉",
               "ganzhi_day": "庚子",
               "ganzhi_hour": "己卯",
               "animal": "龙",
               "term": null,
               "is_leap": false,
               "gregorian_year": "2024",
               "gregorian_month": "10",
               "gregorian_day": "03",
               "gregorian_hour": "05",
               "week_num": 4,
               "week_name": "星期四",
               "is_today": false,
               "constellation": "天秤",
               "ganshen_arr": [
                   "偏财",
                   "伤官",
                   "日主",
                   "正印"
               ],
               "cang_gan_arr": [
                   [
                       "戊",
                       "乙",
                       "癸"
                   ],
                   [
                       "辛"
                   ],
                   [
                       "癸"
                   ],
                   [
                       "乙"
                   ]
               ],
               "ganzhi_shen_arr": [
                   [
                       "偏印",
                       "正财",
                       "伤官"
                   ],
                   [
                       "劫财"
                   ],
                   [
                       "伤官"
                   ],
                   [
                       "正财"
                   ]
               ]
           },
           "wuxing_strength": {
               "wood_strength": 4,
               "fire_strength": 0,
               "earth_strength": 0.8,
               "gold_strength": 12,
               "water_strength": 11.25,
               "yue_zhi_strength": [
                   "死",
                   "囚",
                   "休",
                   "旺",
                   "相"
               ],
               "similar": [
                   "金",
                   "土"
               ]
           },
           "wuxing_suitable": {
               "yong_shen": "金",
               "xi_shen": "土",
               "ji_shen": "木",
               "chou_shen": "水",
               "suggest": "日主天干(庚金)在命局五行中较弱,宜弥补同类五行来增加金的旺度。命局中财星多,财多身弱,喜用比劫。可补身弱财多之不足,帮身担财。因此金就是最喜五行。由于印星能够生身耗财。因此土是次喜五行。"
           },
           "dishi": {
               "nian": "养",
               "yue": "帝旺",
               "ri": "死",
               "shi": "胎"
           },
           "nayin": {
               "nian": "覆灯火",
               "yue": "剑锋金",
               "ri": "壁上土",
               "shi": "城头土"
           },
           "xunkong": {
               "nian": "寅卯",
               "yue": "戌亥",
               "ri": "辰巳",
               "shi": "申酉"
           },
           "char1_wuxing_analyse": "命局五行忌水,将会放大水五行的缺陷,变的急躁,易出祸端,平生多波折,人生起伏较大。",
           "char2_wuxing_analyse": "命局五行字忌木,将会放大木五行的缺陷,变的性格倔强,清高自大,“宁愿站着死,不愿跪着生”。",
           "combine_wuxing_analyse": "水木组合,水生木,木旺。这种组合的人心底善良,富有智慧,做事稳健,人缘好。其人意志坚定,为理想能奋斗到底,耐性佳,能忍受艰苦,依靠自身的努力,取得人生和事业上的成功。",
           "sancai_analyse": {
               "name": "木水木",
               "score": "90",
               "level": "佳",
               "caiyun": "财运佳,但须防意外牵累或损失。",
               "gaishu": "聪明好学,足智多谋,因“水”生“木”,其人富有仁慈心,成功运佳。",
               "jiankang": "身心健康,“木”偏旺,宜注意神经衰弱、肝胆方面的疾病。",
               "jiating": "因主观太强,家庭有些不太美满,若能忍耐,自无大碍。",
               "shiye": "事业运不错,可一展抱负,但谨防受朋友的拖累而受苦。",
               "xingge": "聪明机智,善谋略,刚柔相济。"
           }
       },
       "score": {
           "wenhua": 92.5,
           "ming_li": 38,
           "sheng_xiao": 95,
           "wu_ge": 90,
           "overall": 70.7
       },
       "wenhua": {
           "yin_lv": "董淑可声调为上声、阴平、上声,声律优美,朗朗上口。",
           "zi_xing": "淑为左中右结构,笔画11画;可为半包围结构,笔画5;字型优美,利于书写。",
           "char_idiom_arr": [
               "窈窕淑女",
               "终温且惠,淑慎其身",
               "淑质英才",
               "淑人君子",
               "楚楚可人",
               "幽兰不可俪徒自绕阳春鸢飞入鹰隼鱼目俪玙璠",
               "不可言传",
               "秀色可餐",
               "锐不可当"
           ],
           "description_str": "窈窕淑女 楚楚可人 终温且惠,淑慎其身 幽兰不可俪徒自绕阳春鸢飞入鹰隼鱼目俪玙璠 淑质英才 不可言传 淑人君子 秀色可餐 ",
           "description": [
               "窈窕淑女 楚楚可人",
               "终温且惠,淑慎其身 幽兰不可俪徒自绕阳春鸢飞入鹰隼鱼目俪玙璠",
               "淑质英才 不可言传",
               "淑人君子 秀色可餐"
           ]
       },
       "sheng_xiao": {
           "relation_description": "命主生肖属龙:辰戌冲,忌讳包含戌、狗的汉字;卯辰相害,忌讳包含卯、兔的汉字;辰自刑,忌讳包含辰、龙的汉字。",
           "suitable_bushou": "子、氵、水、雨、申、袁、示、鳥、酉、西、兆、非、羽、主、王、玉、君、帝、言、長、大、天、冠、衣、糸、巾、彡、日、馬、午、金、白、亠、爪"
       },
       "wu_ge": {
           "tian_ge": {
               "mean": "贵人相助兴家兴业的大吉数。",
               "description": "厚重",
               "ji_xiong": "吉",
               "explain": "反凶化吉象。位尊望重,建立基业。雅量厚重,足智多谋,善于协调,所谋如意,家门繁荣,福禄寿俱全。为大事大业可成,富贵发达的好暗示。属温和之首领运数。"
           },
           "ren_ge": {
               "mean": "欲望无休止的诽难运数。",
               "description": "增长",
               "ji_xiong": "凶",
               "explain": "欲望无止境,自信心过强,不容他人言语,多受诽谤攻击,而易致失败。始以其智谋,努力奋斗博得名利。待过中年,势渐趋下,内外酿出不和,难以发达到老,假使自身温顺富有,也不免内部背后是非不息。大多为半途中折之象。或因其他运的关系而陷于刑罚、孤独、死于逆难等。"
           },
           "di_ge": {
               "mean": "突破万难的刚柔兼备数。",
               "description": "刚强",
               "ji_xiong": "吉",
               "explain": "权威刚强,意志坚定,勇往直前,具有突破万难的气力。成就大功大业,但因赋性过刚,自我心强而恐与人不和,反招事非厄患,遂致失败,慎戒则为大吉。女性有此数者易流于男性,宜涵养女德,存主温和,福禄自然随之。先天条件弱的妇女反用此数为妥。"
           },
           "wai_ge": {
               "mean": "安稳余庆吉人天相数。",
               "description": "安稳",
               "ji_xiong": "吉",
               "explain": "天德地祥俱备,天地人和。财禄丰盈,富裕安稳,家势盛大,万宝朝宗之运。然而满极必损,盈极则亏。若其他要素配合不周者,恐或如流水而下,成为所谓乐极生悲之象。此数理为天赋之美,安稳吉庆终生。"
           },
           "zong_ge": {
               "mean": "权贵显达的意外惠泽数。",
               "description": "宝马金鞍",
               "ji_xiong": "吉",
               "explain": "侥幸多望之格,常得长上之庇护。若能得长辈提掖,其成功将势如破竹。且此数理者品性温良,大有爱护他人之德。家门隆昌繁荣,为至上的吉数,最适合女性用。"
           }
       }
   },
   "text": {
       "copyright": "公共API https://qqlykm.cn"
   }
}

错误码类型说明
200int请求成功
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://qqlykm.cn/api/qiming/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 接口的实时请求测试,实时返回接口响应结果,助力开发者快速排查接口问题。
⚠️ 本工具为真实请求,将消耗额度 / 产生计费,请勿填写私密信息。
⚠️ 本页面工具将自动添加请求头,无需手动添加。
请求参数
参数名 参数值 操作

用户反馈

近期反馈0
未登录

登录 后反馈

仅需三步即可快速接入

1
注册认证 · 获取密钥

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

2
接口调试 · 开发集成

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

3
生产上线 · 监控运维

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