语音合成
语音合成 API 接口,文本一键转高保真真人语音,支持40种国家语言,自动判断文字语言进行合成
计费优先级(按已开通的计费类型依次校验):
vip专属->单独包月->次数包->点数计费->账户余额->免费额度
按量计费:
该产品支持点数余额抵扣,计费单价:0.06 点/字符 取整,不满1点按1点计费 按字符计费
账户余额:
该产品支持账户余额抵扣,计费单价:0.0006 元/字符; 按字符计费
请求限制:
| 免费/测试用户请求频率限制 | 请求频率总限制 | 每日请求次数总限制 |
|---|---|---|
| 0秒0次 每个免费用户的QPS总限制 | 1秒100次 每个用户QPS总限制 | 10000000 (次) 每个用户每日请求总次数 |
其他准入要求:
接口地址: https://api.wuyinkeji.com/api/async/audio_tts
返回格式: application/json
请求方式: HTTPPOST
请求示例:
https://api.wuyinkeji.com/api/async/audio_tts?key=你的密钥
请求HEADER:
| 名称 | 值 |
|---|---|
| Authorization | 接口密钥,在控制台->密钥管理查看 |
请求参数说明:
| 名称 | 必填 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| text | 是 | string | 待合成的文本 | |
| voice_id | 是 | string | 音色ID 系统音色在文档下方 | |
| speed | 否 | string | 1 | 范围[0.5,2],默认值为1.0,生成声音的语速,可选,取值越大,语速越快。 |
| vol | 否 | string | 1 | 范围(0,10],默认值为1.0 生成声音的音量,可选,取值越大,音量越高。 |
| language_boost | 否 | string | 语种 默认auto 增强对指定的小语种和方言的识别能力,设置后可以提升在指定小语种/方言场景下的语音表现。如果不明确小语种类型,则可以选择"auto",模型将自主判断小语种类型。支持以下取值: |
返回参数说明:
| 名称 | 类型 | 说明 |
|---|---|---|
| code | int | 状态码 |
| msg | string | 状态信息 |
| data | string | 请求结果数据集 |
| data.id | string | 请求结果id |
| exec_time | float | 执行耗时 |
| user_ip | string | 客户端IP |
系统音色
序号 语言 音色ID (Voice ID) 音色名称 (Voice Name)
1 中文 (普通话) male-qn-qingse 青涩青年音色
2 中文 (普通话) male-qn-jingying 精英青年音色
3 中文 (普通话) male-qn-badao 霸道青年音色
4 中文 (普通话) male-qn-daxuesheng 青年大学生音色
5 中文 (普通话) female-shaonv 少女音色
6 中文 (普通话) female-yujie 御姐音色
7 中文 (普通话) female-chengshu 成熟女性音色
8 中文 (普通话) female-tianmei 甜美女性音色
9 中文 (普通话) male-qn-qingse-jingpin 青涩青年音色-beta
10 中文 (普通话) male-qn-jingying-jingpin 精英青年音色-beta
11 中文 (普通话) male-qn-badao-jingpin 霸道青年音色-beta
12 中文 (普通话) male-qn-daxuesheng-jingpin 青年大学生音色-beta
13 中文 (普通话) female-shaonv-jingpin 少女音色-beta
14 中文 (普通话) female-yujie-jingpin 御姐音色-beta
15 中文 (普通话) female-chengshu-jingpin 成熟女性音色-beta
16 中文 (普通话) female-tianmei-jingpin 甜美女性音色-beta
17 中文 (普通话) clever_boy 聪明男童
18 中文 (普通话) cute_boy 可爱男童
19 中文 (普通话) lovely_girl 萌萌女童
20 中文 (普通话) cartoon_pig 卡通猪小琪
21 中文 (普通话) bingjiao_didi 病娇弟弟
22 中文 (普通话) junlang_nanyou 俊朗男友
23 中文 (普通话) chunzhen_xuedi 纯真学弟
24 中文 (普通话) lengdan_xiongzhang 冷淡学长
25 中文 (普通话) badao_shaoye 霸道少爷
26 中文 (普通话) tianxin_xiaoling 甜心小玲
27 中文 (普通话) qiaopi_mengmei 俏皮萌妹
28 中文 (普通话) wumei_yujie 妩媚御姐
29 中文 (普通话) diadia_xuemei 嗲嗲学妹
30 中文 (普通话) danya_xuejie 淡雅学姐
31 中文 (普通话) Chinese (Mandarin)_Reliable_Executive 沉稳高管
32 中文 (普通话) Chinese (Mandarin)_News_Anchor 新闻女声
33 中文 (普通话) Chinese (Mandarin)_Mature_Woman 傲娇御姐
34 中文 (普通话) Chinese (Mandarin)_Unrestrained_Young_Man 不羁青年
35 中文 (普通话) Arrogant_Miss 嚣张小姐
36 中文 (普通话) Robot_Armor 机械战甲
37 中文 (普通话) Chinese (Mandarin)_Kind-hearted_Antie 热心大婶
38 中文 (普通话) Chinese (Mandarin)_HK_Flight_Attendant 港普空姐
39 中文 (普通话) Chinese (Mandarin)_Humorous_Elder 搞笑大爷
40 中文 (普通话) Chinese (Mandarin)_Gentleman 温润男声
41 中文 (普通话) Chinese (Mandarin)_Warm_Bestie 温暖闺蜜
42 中文 (普通话) Chinese (Mandarin)_Male_Announcer 播报男声
43 中文 (普通话) Chinese (Mandarin)_Sweet_Lady 甜美女声
44 中文 (普通话) Chinese (Mandarin)_Southern_Young_Man 南方小哥
45 中文 (普通话) Chinese (Mandarin)_Wise_Women 阅历姐姐
46 中文 (普通话) Chinese (Mandarin)_Gentle_Youth 温润青年
47 中文 (普通话) Chinese (Mandarin)_Warm_Girl 温暖少女
48 中文 (普通话) Chinese (Mandarin)_Kind-hearted_Elder 花甲奶奶
49 中文 (普通话) Chinese (Mandarin)_Cute_Spirit 憨憨萌兽
50 中文 (普通话) Chinese (Mandarin)_Radio_Host 电台男主播
51 中文 (普通话) Chinese (Mandarin)_Lyrical_Voice 抒情男声
52 中文 (普通话) Chinese (Mandarin)_Straightforward_Boy 率真弟弟
53 中文 (普通话) Chinese (Mandarin)_Sincere_Adult 真诚青年
54 中文 (普通话) Chinese (Mandarin)_Gentle_Senior 温柔学姐
55 中文 (普通话) Chinese (Mandarin)_Stubborn_Friend 嘴硬竹马
56 中文 (普通话) Chinese (Mandarin)_Crisp_Girl 清脆少女
57 中文 (普通话) Chinese (Mandarin)_Pure-hearted_Boy 清澈邻家弟弟
58 中文 (普通话) Chinese (Mandarin)_Soft_Girl 柔和少女
59 中文 (粤语) Cantonese_ProfessionalHost(F) 专业女主持
60 中文 (粤语) Cantonese_GentleLady 温柔女声
61 中文 (粤语) Cantonese_ProfessionalHost(M) 专业男主持
62 中文 (粤语) Cantonese_PlayfulMan 活泼男声
63 中文 (粤语) Cantonese_CuteGirl 可爱女孩
64 中文 (粤语) Cantonese_KindWoman 善良女声
65 英文 Santa_Claus Santa Claus
66 英文 Grinch Grinch
67 英文 Rudolph Rudolph
68 英文 Arnold Arnold
69 英文 Charming_Santa Charming Santa
70 英文 Charming_Lady Charming Lady
71 英文 Sweet_Girl Sweet Girl
72 英文 Cute_Elf Cute Elf
73 英文 Attractive_Girl Attractive Girl
74 英文 Serene_Woman Serene Woman
75 英文 English_Trustworthy_Man Trustworthy Man
76 英文 English_Graceful_Lady Graceful Lady
77 英文 English_Aussie_Bloke Aussie Bloke
78 英文 English_Whispering_girl Whispering girl
79 英文 English_Diligent_Man Diligent Man
80 英文 English_Gentle-voiced_man Gentle-voiced man
81 日文 Japanese_IntellectualSenior Intellectual Senior
82 日文 Japanese_DecisivePrincess Decisive Princess
83 日文 Japanese_LoyalKnight Loyal Knight
84 日文 Japanese_DominantMan Dominant Man
85 日文 Japanese_SeriousCommander Serious Commander
86 日文 Japanese_ColdQueen Cold Queen
87 日文 Japanese_DependableWoman Dependable Woman
88 日文 Japanese_GentleButler Gentle Butler
89 日文 Japanese_KindLady Kind Lady
90 日文 Japanese_CalmLady Calm Lady
91 日文 Japanese_OptimisticYouth Optimistic Youth
92 日文 Japanese_GenerousIzakayaOwner Generous Izakaya Owner
93 日文 Japanese_SportyStudent Sporty Student
94 日文 Japanese_InnocentBoy Innocent Boy
95 日文 Japanese_GracefulMaiden Graceful Maiden
96 韩文 Korean_SweetGirl Sweet Girl
97 韩文 Korean_CheerfulBoyfriend Cheerful Boyfriend
98 韩文 Korean_EnchantingSister Enchanting Sister
99 韩文 Korean_ShyGirl Shy Girl
100 韩文 Korean_ReliableSister Reliable Sister
101 韩文 Korean_StrictBoss Strict Boss
102 韩文 Korean_SassyGirl Sassy Girl
103 韩文 Korean_ChildhoodFriendGirl Childhood Friend Girl
104 韩文 Korean_PlayboyCharmer Playboy Charmer
105 韩文 Korean_ElegantPrincess Elegant Princess
106 韩文 Korean_BraveFemaleWarrior Brave Female Warrior
107 韩文 Korean_BraveYouth Brave Youth
108 韩文 Korean_CalmLady Calm Lady
109 韩文 Korean_EnthusiasticTeen Enthusiastic Teen
110 韩文 Korean_SoothingLady Soothing Lady
111 韩文 Korean_IntellectualSenior Intellectual Senior
112 韩文 Korean_LonelyWarrior Lonely Warrior
113 韩文 Korean_MatureLady Mature Lady
114 韩文 Korean_InnocentBoy Innocent Boy
115 韩文 Korean_CharmingSister Charming Sister
116 韩文 Korean_AthleticStudent Athletic Student
117 韩文 Korean_BraveAdventurer Brave Adventurer
118 韩文 Korean_CalmGentleman Calm Gentleman
119 韩文 Korean_WiseElf Wise Elf
120 韩文 Korean_CheerfulCoolJunior Cheerful Cool Junior
121 韩文 Korean_DecisiveQueen Decisive Queen
122 韩文 Korean_ColdYoungMan Cold Young Man
123 韩文 Korean_MysteriousGirl Mysterious Girl
124 韩文 Korean_QuirkyGirl Quirky Girl
125 韩文 Korean_ConsiderateSenior Considerate Senior
126 韩文 Korean_CheerfulLittleSister Cheerful Little Sister
127 韩文 Korean_DominantMan Dominant Man
128 韩文 Korean_AirheadedGirl Airheaded Girl
129 韩文 Korean_ReliableYouth Reliable Youth
130 韩文 Korean_FriendlyBigSister Friendly Big Sister
131 韩文 Korean_GentleBoss Gentle Boss
132 韩文 Korean_ColdGirl Cold Girl
133 韩文 Korean_HaughtyLady Haughty Lady
134 韩文 Korean_CharmingElderSister Charming Elder Sister
135 韩文 Korean_IntellectualMan Intellectual Man
136 韩文 Korean_CaringWoman Caring Woman
137 韩文 Korean_WiseTeacher Wise Teacher
138 韩文 Korean_ConfidentBoss Confident Boss
139 韩文 Korean_AthleticGirl Athletic Girl
140 韩文 Korean_PossessiveMan Possessive Man
141 韩文 Korean_GentleWoman Gentle Woman
142 韩文 Korean_CockyGuy Cocky Guy
143 韩文 Korean_ThoughtfulWoman Thoughtful Woman
144 韩文 Korean_OptimisticYouth Optimistic Youth
145 西班牙文 Spanish_SereneWoman Serene Woman
146 西班牙文 Spanish_MaturePartner Mature Partner
147 西班牙文 Spanish_CaptivatingStoryteller Captivating Storyteller
148 西班牙文 Spanish_Narrator Narrator
149 西班牙文 Spanish_WiseScholar Wise Scholar
150 西班牙文 Spanish_Kind-heartedGirl Kind-hearted Girl
151 西班牙文 Spanish_DeterminedManager Determined Manager
152 西班牙文 Spanish_BossyLeader Bossy Leader
153 西班牙文 Spanish_ReservedYoungMan Reserved Young Man
154 西班牙文 Spanish_ConfidentWoman Confident Woman
155 西班牙文 Spanish_ThoughtfulMan Thoughtful Man
156 西班牙文 Spanish_Strong-WilledBoy Strong-willed Boy
157 西班牙文 Spanish_SophisticatedLady Sophisticated Lady
158 西班牙文 Spanish_RationalMan Rational Man
159 西班牙文 Spanish_AnimeCharacter Anime Character
160 西班牙文 Spanish_Deep-tonedMan Deep-toned Man
161 西班牙文 Spanish_Fussyhostess Fussy hostess
162 西班牙文 Spanish_SincereTeen Sincere Teen
163 西班牙文 Spanish_FrankLady Frank Lady
164 西班牙文 Spanish_Comedian Comedian
165 西班牙文 Spanish_Debator Debator
166 西班牙文 Spanish_ToughBoss Tough Boss
167 西班牙文 Spanish_Wiselady Wise Lady
168 西班牙文 Spanish_Steadymentor Steady Mentor
169 西班牙文 Spanish_Jovialman Jovial Man
170 西班牙文 Spanish_SantaClaus Santa Claus
171 西班牙文 Spanish_Rudolph Rudolph
172 西班牙文 Spanish_Intonategirl Intonate Girl
173 西班牙文 Spanish_Arnold Arnold
174 西班牙文 Spanish_Ghost Ghost
175 西班牙文 Spanish_HumorousElder Humorous Elder
176 西班牙文 Spanish_EnergeticBoy Energetic Boy
177 西班牙文 Spanish_WhimsicalGirl Whimsical Girl
178 西班牙文 Spanish_StrictBoss Strict Boss
179 西班牙文 Spanish_ReliableMan Reliable Man
180 西班牙文 Spanish_SereneElder Serene Elder
181 西班牙文 Spanish_AngryMan Angry Man
182 西班牙文 Spanish_AssertiveQueen Assertive Queen
183 西班牙文 Spanish_CaringGirlfriend Caring Girlfriend
184 西班牙文 Spanish_PowerfulSoldier Powerful Soldier
185 西班牙文 Spanish_PassionateWarrior Passionate Warrior
186 西班牙文 Spanish_ChattyGirl Chatty Girl
187 西班牙文 Spanish_RomanticHusband Romantic Husband
188 西班牙文 Spanish_CompellingGirl Compelling Girl
189 西班牙文 Spanish_PowerfulVeteran Powerful Veteran
190 西班牙文 Spanish_SensibleManager Sensible Manager
191 西班牙文 Spanish_ThoughtfulLady Thoughtful Lady
192 葡萄牙文 Portuguese_SentimentalLady Sentimental Lady
193 葡萄牙文 Portuguese_BossyLeader Bossy Leader
194 葡萄牙文 Portuguese_Wiselady Wise lady
195 葡萄牙文 Portuguese_Strong-WilledBoy Strong-willed Boy
196 葡萄牙文 Portuguese_Deep-VoicedGentleman Deep-voiced Gentleman
197 葡萄牙文 Portuguese_UpsetGirl Upset Girl
198 葡萄牙文 Portuguese_PassionateWarrior Passionate Warrior
199 葡萄牙文 Portuguese_AnimeCharacter Anime Character
200 葡萄牙文 Portuguese_ConfidentWoman Confident Woman
201 葡萄牙文 Portuguese_AngryMan Angry Man
202 葡萄牙文 Portuguese_CaptivatingStoryteller Captivating Storyteller
203 葡萄牙文 Portuguese_Godfather Godfather
204 葡萄牙文 Portuguese_ReservedYoungMan Reserved Young Man
205 葡萄牙文 Portuguese_SmartYoungGirl Smart Young Girl
206 葡萄牙文 Portuguese_Kind-heartedGirl Kind-hearted Girl
207 葡萄牙文 Portuguese_Pompouslady Pompous lady
208 葡萄牙文 Portuguese_Grinch Grinch
209 葡萄牙文 Portuguese_Debator Debator
210 葡萄牙文 Portuguese_SweetGirl Sweet Girl
211 葡萄牙文 Portuguese_AttractiveGirl Attractive Girl
212 葡萄牙文 Portuguese_ThoughtfulMan Thoughtful Man
213 葡萄牙文 Portuguese_PlayfulGirl Playful Girl
214 葡萄牙文 Portuguese_GorgeousLady Gorgeous Lady
215 葡萄牙文 Portuguese_LovelyLady Lovely Lady
216 葡萄牙文 Portuguese_SereneWoman Serene Woman
217 葡萄牙文 Portuguese_SadTeen Sad Teen
218 葡萄牙文 Portuguese_MaturePartner Mature Partner
219 葡萄牙文 Portuguese_Comedian Comedian
220 葡萄牙文 Portuguese_NaughtySchoolgirl Naughty Schoolgirl
221 葡萄牙文 Portuguese_Narrator Narrator
222 葡萄牙文 Portuguese_ToughBoss Tough Boss
223 葡萄牙文 Portuguese_Fussyhostess Fussy hostess
224 葡萄牙文 Portuguese_Dramatist Dramatist
225 葡萄牙文 Portuguese_Steadymentor Steady Mentor
226 葡萄牙文 Portuguese_Jovialman Jovial Man
227 葡萄牙文 Portuguese_CharmingQueen Charming Queen
228 葡萄牙文 Portuguese_SantaClaus Santa Claus
229 葡萄牙文 Portuguese_Rudolph Rudolph
230 葡萄牙文 Portuguese_Arnold Arnold
231 葡萄牙文 Portuguese_CharmingSanta Charming Santa
232 葡萄牙文 Portuguese_CharmingLady Charming Lady
233 葡萄牙文 Portuguese_Ghost Ghost
234 葡萄牙文 Portuguese_HumorousElder Humorous Elder
235 葡萄牙文 Portuguese_CalmLeader Calm Leader
236 葡萄牙文 Portuguese_GentleTeacher Gentle Teacher
237 葡萄牙文 Portuguese_EnergeticBoy Energetic Boy
238 葡萄牙文 Portuguese_ReliableMan Reliable Man
239 葡萄牙文 Portuguese_SereneElder Serene Elder
240 葡萄牙文 Portuguese_GrimReaper Grim Reaper
241 葡萄牙文 Portuguese_AssertiveQueen Assertive Queen
242 葡萄牙文 Portuguese_WhimsicalGirl Whimsical Girl
243 葡萄牙文 Portuguese_StressedLady Stressed Lady
244 葡萄牙文 Portuguese_FriendlyNeighbor Friendly Neighbor
245 葡萄牙文 Portuguese_CaringGirlfriend Caring Girlfriend
246 葡萄牙文 Portuguese_PowerfulSoldier Powerful Soldier
247 葡萄牙文 Portuguese_FascinatingBoy Fascinating Boy
248 葡萄牙文 Portuguese_RomanticHusband Romantic Husband
249 葡萄牙文 Portuguese_StrictBoss Strict Boss
250 葡萄牙文 Portuguese_InspiringLady Inspiring Lady
251 葡萄牙文 Portuguese_PlayfulSpirit Playful Spirit
252 葡萄牙文 Portuguese_ElegantGirl Elegant Girl
253 葡萄牙文 Portuguese_CompellingGirl Compelling Girl
254 葡萄牙文 Portuguese_PowerfulVeteran Powerful Veteran
255 葡萄牙文 Portuguese_SensibleManager Sensible Manager
256 葡萄牙文 Portuguese_ThoughtfulLady Thoughtful Lady
257 葡萄牙文 Portuguese_TheatricalActor Theatrical Actor
258 葡萄牙文 Portuguese_FragileBoy Fragile Boy
259 葡萄牙文 Portuguese_ChattyGirl Chatty Girl
260 葡萄牙文 Portuguese_Conscientiousinstructor Conscientious Instructor
261 葡萄牙文 Portuguese_RationalMan Rational Man
262 葡萄牙文 Portuguese_WiseScholar Wise Scholar
263 葡萄牙文 Portuguese_FrankLady Frank Lady
264 葡萄牙文 Portuguese_DeterminedManager Determined Manager
265 法文 French_Male_Speech_New Level-Headed Man
266 法文 French_Female_News Anchor Patient Female Presenter
267 法文 French_CasualMan Casual Man
268 法文 French_MovieLeadFemale Movie Lead Female
269 法文 French_FemaleAnchor Female Anchor
270 法文 French_MaleNarrator Male Narrator
271 印尼文 Indonesian_SweetGirl Sweet Girl
272 印尼文 Indonesian_ReservedYoungMan Reserved Young Man
273 印尼文 Indonesian_CharmingGirl Charming Girl
274 印尼文 Indonesian_CalmWoman Calm Woman
275 印尼文 Indonesian_ConfidentWoman Confident Woman
276 印尼文 Indonesian_CaringMan Caring Man
277 印尼文 Indonesian_BossyLeader Bossy Leader
278 印尼文 Indonesian_DeterminedBoy Determined Boy
279 印尼文 Indonesian_GentleGirl Gentle Girl
280 德文 German_FriendlyMan Friendly Man
281 德文 German_SweetLady Sweet Lady
282 德文 German_PlayfulMan Playful Man
283 俄文 Russian_HandsomeChildhoodFriend Handsome Childhood Friend
284 俄文 Russian_BrightHeroine Bright Queen
285 俄文 Russian_AmbitiousWoman Ambitious Woman
286 俄文 Russian_ReliableMan Reliable Man
287 俄文 Russian_CrazyQueen Crazy Girl
288 俄文 Russian_PessimisticGirl Pessimistic Girl
289 俄文 Russian_AttractiveGuy Attractive Guy
290 俄文 Russian_Bad-temperedBoy Bad-tempered Boy
291 意大利文 Italian_BraveHeroine Brave Heroine
292 意大利文 Italian_Narrator Narrator
293 意大利文 Italian_WanderingSorcerer Wandering Sorcerer
294 意大利文 Italian_DiligentLeader Diligent Leader
295 阿拉伯文 Arabic_CalmWoman Calm Woman
296 阿拉伯文 Arabic_FriendlyGuy Friendly Guy
297 土耳其文 Turkish_CalmWoman Calm Woman
298 土耳其文 Turkish_Trustworthyman Trustworthy man
299 乌克兰文 Ukrainian_CalmWoman Calm Woman
300 乌克兰文 Ukrainian_WiseScholar Wise Scholar
301 荷兰文 Dutch_kindhearted_girl Kind-hearted girl
302 荷兰文 Dutch_bossy_leader Bossy leader
303 越南文 Vietnamese_kindhearted_girl Kind-hearted girl
304 泰文 Thai_male_1_sample8 Serene Man
305 泰文 Thai_male_2_sample2 Friendly Man
306 泰文 Thai_female_1_sample1 Confident Woman
307 泰文 Thai_female_2_sample2 Energetic Woman
308 波兰文 Polish_male_1_sample4 Male Narrator
309 波兰文 Polish_male_2_sample3 Male Anchor
310 波兰文 Polish_female_1_sample1 Calm Woman
311 波兰文 Polish_female_2_sample3 Casual Woman
312 罗马尼亚文 Romanian_male_1_sample2 Reliable Man
313 罗马尼亚文 Romanian_male_2_sample1 Energetic Youth
314 罗马尼亚文 Romanian_female_1_sample4 Optimistic Youth
315 罗马尼亚文 Romanian_female_2_sample1 Gentle Woman
316 希腊文 greek_male_1a_v1 Thoughtful Mentor
317 希腊文 Greek_female_1_sample1 Gentle Lady
318 希腊文 Greek_female_2_sample3 Girl Next Door
319 捷克文 czech_male_1_v1 Assured Presenter
320 捷克文 czech_female_5_v7 Steadfast Narrator
321 捷克文 czech_female_2_v2 Elegant Lady
322 芬兰文 finnish_male_3_v1 Upbeat Man
323 芬兰文 finnish_male_1_v2 Friendly Boy
324 芬兰文 finnish_female_4_v1 Assetive Woman
325 印地文 hindi_male_1_v2 Trustworthy Advisor
326 印地文 hindi_female_2_v1 Tranquil Woman
327 印地文 hindi_female_1_v2 News Anchor
<?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://api.wuyinkeji.com/api/async/audio_tts', [
'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}×tamp={$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
⚠️ 本工具为真实请求,将消耗额度 / 产生计费,请勿填写私密信息。
⚠️ 本页面工具将自动添加请求头,无需手动添加。