星座运势查询API
查询异步任务执行状态,获取任务处理结果,支持多种异步处理场景。
调用权限
正常
请求频率限制
0.2次/秒 (1 QPS)
免费额度
无
参考价格
免费
请求限制:
| 免费/测试用户请求频率限制 | 请求频率总限制 | 每日请求次数总限制 |
|---|---|---|
| 5秒30次 每个免费用户的QPS总限制 | 5秒1次 每个用户QPS总限制 | 100 (次) 每个用户每日请求总次数 |
其他准入要求:
无
接口地址: https://qqlykm.cn/api/xingzuo/get
返回格式: application/json
请求方式: HTTPGET
请求示例:
?code=106
请求HEADER:
| 名称 | 值 |
|---|---|
| Content-Type | application/x-www-form-urlencoded;charset:utf-8; |
请求参数说明:
| 名称 | 必填 | 类型 | 示例值 | 说明 |
|---|---|---|---|---|
| key | 是 | string | 123 | 接口密钥,在控制台->密钥管理查看 |
| code | 是 | string | 106 | 处女座 |
code星座代码(请求时输入代码数字即可 不用加等号):
101=白羊座
102=金牛座
103=双子座
104=巨蟹座
105=狮子座
106=处女座
107=天秤座
108=天蝎座
109=射手座
110=魔羯座
111=水瓶座
112=双鱼座
2024-1-11:优化请求速度,更新数据库(新增 工作指数 运势),修复几处BUG。
返回参数说明:
| 名称 | 类型 | 说明 |
|---|---|---|
| data.date | string | 当前日期 |
| data.star | string | 当前星座 |
| day_notice | string | 建议 |
| data.today | array | 今日运势 |
| data.tomorrow | array | 明日运势 |
| data.this_week | array | 本周运势 |
| data.this_month | array | 本月运势 |
| data.this_year | array | 本年综合运势 |
| lucky_time | string | 幸运时间 |
| lucky_color | string | 幸运颜色 |
| lucky_num | string | 幸运数字 |
| grxz | string | 贵人星座 |
| exponents | array | 指数 |
| exponents.zonghe.star | string | 综合指数评星 |
| exponents.zonghe.content | string | 综合指数内容 |
| exponents.caiyun.star | string | 财运指数评星 |
| exponents.caiyun.content | string | 财运指数内容 |
| exponents.aiqing.star | string | 爱情指数评星 |
| exponents.aiqing.content | string | 爱情指数内容 |
| exponents.gongzuo.star | string | 工作指数评星 |
| exponents.gongzuo.content | string | 工作指数内容 |
| data.this_year.time | string | 当前年份 |
| data.this_year.oneword | string | 本年一句话建议 |
| data.this_year.xxx.xxx_index | string | 运势得分 |
| data.this_year.xxx.xxx_txt | string | 年度运势说明 |
返回示例:
{ "success": true, "code": 200, "data": { "date": "2024-01-11", "star": "处女座", "today": { "lucky_time": "16:00-18:00", "lucky_color": "军绿色", "lucky_num": "8", "grxz": "天秤座", "day_notice": "走路和运动过程中比较冒冒失失,容易出现磕磕撞撞而受伤的情况,自己要多加小心,走路的时候不要低头玩手机。", "exponents": { "zonghe": { "star": "3", "content": "在交际圈十分引人注目,吸引异性的眼光,合作机会也多,但需要你擦亮眼睛,并非任何人都能达成愉快的合作。部分人在外出差忙得不可开交,临危授命的情况也存在。赚多花多,部分人家中有烦心事需要处理,也容易和伴侣吵架。" }, "caiyun": { "star": "3", "content": "或有意外财的到账,而且奖金方面的收入也会很可观,投资理财眼光比较不错,有望通过看好的项目赢得丰厚的收益。" }, "aiqing": { "star": "1", "content": "单身的要警惕烂桃花,暧昧不清会很麻烦。恋爱中的不要心软,面对前度旧情要当断则断,不要拖泥带水的。" }, "gongzuo": { "star": "3", "content": "工作方面你需要提高自己的行事效率,尽量不要把手机放在触手可及的地方,面对诱惑要及时醒悟,警惕身边的竞争对手。" } } }, "tomorrow": { "lucky_time": "10:00-12:00", "lucky_color": "米白色", "lucky_num": "6", "grxz": "水瓶座", "day_notice": "以学习储备知识", "exponents": { "zonghe": { "star": "4", "content": "运势较好,容易取得一些进展的一天。或许会显得有些忙碌和紧张,但是你的储备知识和能量有利于帮助你应对各种挑战。建议你继续保持学习和积累,不断提升自己的能力和知识水平。在生活方面,可以考虑参加一些文化活动,比如参观博物馆、看展览或者去图书馆借书,涨涨见识。" }, "caiyun": { "star": "3", "content": "财运一般,要特别警惕冲动消费。避免被各种促销和诱惑所迷惑,要理性评估自己的购买需求,避免浪费金钱。同时,也要注重节约开支和合理规划财务,以保证财务稳定。" }, "aiqing": { "star": "3", "content": "单身的你可能会与一位有共同兴趣爱好的人相识,但相处时可能会缺乏一些火花和激情。已有伴者的建议与伴侣一起寻找新的共同兴趣爱好,增加彼此的交流和互动,以唤起感情中的激情和浪漫。" }, "gongzuo": { "star": "4", "content": "需要按照轻重缓急进行工作和学习。要有清晰的目标和计划,合理安排时间和精力。把握优先级,先做重要的事情,再处理次要的事务。" } } }, "this_week": { "lucky_color": "白色", "lucky_num": "0", "lucky_day": "星期四", "grxz": "摩羯座", "week_notice": "争取助力,一切顺利。", "exponents": { "zonghe": { "star": "4", "content": "处女座本周的综合运势较为平稳,但需要努力的摆平自己的姿态,保持内心的平静。在面对工作和生活的压力时,寻找适合自己的放松方式,如运动、冥想或阅读等,以保持良好的心态和积极的情绪。同时,积极参与团队合作,与同事和谐相处,共同完成工作任务。" }, "caiyun": { "star": "4", "content": "处女座本周的财富运势良好,但要注意理性管理财务。对于投资和消费,要保持适度,避免过度消费或冲动投资。合理规划和分配资金,能够稳定增加自己的财富积累。" }, "aiqing": { "star": "4", "content": "单身的处女座,本周的桃花运势有所提升,有机会遇到令你心动的人。但要注意保持积极主动,主动表达自己的感受和想法,才能增加感情发展的可能性。有伴侣的处女座,在情感互动和相处方面能够更趋于和谐,有机会解决之前存在的小矛盾,提升彼此的感情。" }, "gongzuo": { "star": "4", "content": "在事业方面,处女座本周的工作状态可能受到一些压力的影响,需要努力保持适度放松,避免过度压力带来的不良影响。要提高工作效率,合理安排任务和时间,积极参与团队合作,共同完成项目。在学业上,处女座的学习思路较为清晰,能够迅速掌握知识并灵活运用,但不要孤立自己,多与同学交流合作,共同进步。" } } }, "this_month": { "grxz": "摩羯座", "exponents": { "zonghe": { "star": "3", "content": "情绪起伏变化较大的一个月。单身者深受别人爱情甜蜜的刺激,心情压抑;工作表现出色,得到上司嘉奖,自信心增强;投资眼光不准,最好不要参与投资活动。" }, "caiyun": { "star": "2", "content": "处女座的财富运势在本月有所回升,之前一直未能解决的款项会逐渐得到解决。同时,小部分人有可能会有中奖的机会出现。要保持理性和谨慎的态度,不要贪图一时的利益而做出冲动的投资决策,稳健地管理自己的财务。" }, "aiqing": { "star": "2", "content": "单身者:单身者看到周围朋友牵手幸福的场景,很容易想到曾经错过的机会,产生自怨自艾的情绪,有继续空窗下去的可能。月中和月底有认识异性朋友的机会,但交流太少,相处机会也不多,很容易不了了之。有伴侣:误会连连的月份,若不及时解开对方心中的困扰,两个人心与心的距离有可能越拉越远。月初易因为出差或是为了朋友而与对方暂时分开几天,要每天保持联系,关心与体贴是提升感情温度的最佳途径。" }, "gongzuo": { "star": "4", "content": "工作:本月上班族就像个勤劳的小蜜蜂,不停忙碌,自己的工作做完了,还有帮助同事分担工作的热情。你的奋斗精神和冲劲被上司看在眼中,可期待月底综合考评的嘉奖,能微笑工作一整月。学生:精力旺盛,上课注意力集中,就算是自习课也能静下心来学习。上半月学习有计划,有目标,能得到老师的特别关照,有任何不懂的问题都可以大胆提问。下半月偏科现象有所缓解,有更多的时间花在弱势科目上,小有进步。" } } }, "this_year": { "time": "2024", "oneword": "这会是决定你未来人生很重要的一年", "general": { "general_index": "80分", "general_txt": "对于处女座来说,进入2024年,在某些方面可能会出现一些起伏,但是另外一些方面,可能又会有惊喜,要区别对待。无论如何,都要保持内心的强大,还要停留在正义的道路上,这样生活才会变得越来越好。2024年9月9号到10月2号,由于受到水星逆行的影响,处女座的运势可能会呈现出持续下跌的态势。这段期间,千万不要做任何对自己不利的事情,否则会带来严重的后果,身上的压力会变得极为沉重。处女座在2024年可佩戴一件【念瑜平安扣星座吉宏项链】作为本年度的吉祥饰物,处女座专属符号与好运平安扣巧妙结合,寓意圆满幸福,岁岁平安,带动处女们各方面运势指数高升,期盼新的一年万事顺意,好运连连。" }, "health": { "health_txt": "健康方面,处女座2024年身体状况不太好,各种疾病轮番上阵。尤其是换季的时候,一定要多加注意防范,及时增减衣物。尤其是女性朋友,冬天要注意手足的保暖,以免冻伤关节或是膝盖,给自己带来很大的痛苦。本年度皮肤问题较多,平时要注重个人干净卫生整洁,每天回家第一件事情,是用洗面奶认真清洗面部,以免堆积过多油脂滋生痘痘,或者引发其他的皮肤问题。此外,要兼顾好工作与生活,不可废寝忘食,劳逸结合才是王道。" }, "love": { "love_index": "60分", "love_txt": "感情方面,有对象的朋友本年度必须要充分理解伴侣的想法,遇到事情注重沟通协调,尽量不要争吵,否则会伤害到彼此之间的感情,还有可能直接导致分手。单身的朋友,尤其是年纪比较大的人,可能会被父母疯狂催婚,还需要经常去参加相亲饭局。但很难遇到合适的异性,内心会非常焦虑,还会特别抵触这种认识异性的方式。已婚的朋友孩子特别不听话,处女难免会因此而感到恼怒。在教育孩子方面分歧较大,家庭内部乌烟瘴气,婚姻生活不幸福。面对这种情况,处女座一定要及时解决问题,千万不要逃避责任,置之不理。处女座在2024年可以佩戴一条【念瑜粉晶爱心萌龙手链】来作为守护感情的吉祥物,爱情之石粉水晶与爱心萌龙结合,双重助力可增强人缘魅力,有助单身人士提升桃花气场,催旺异性缘,早日邂逅真爱良缘;恋爱或已婚者则可催动恋情升温,摆脱烂桃花侵扰,使得婚恋顺遂,美满幸福。" }, "money": { "money_index": "80分", "money_txt": "2024年处女在金钱方面,开支有可能会增加,但只要有意识去赚钱,也能够获得多个渠道的钱财收入。如果打算进军股票市场,那么要提前进行专业知识的了解与学习,千万不可盲目过于冲动,可向身边有经验的家人朋友请教。处女座在2024年可佩戴一条【念瑜金玉财兽宝懿手绳】作为提升财运的吉祥物,金色的珐琅银饰与和田玉组合而成的金玉财兽,有着只进不出,催旺喜气财气的吉祥寓意,使得处女座在新的一年能财路大开,福运亨通。2024年对于女性朋友来说,千万不要过度贪图光鲜亮丽的生活,举例来说,不要经常去参加演唱会、音乐节,或者追星等等,这样都会给自己带来沉重的经济负担。男性朋友本年度可能有购房买车的需求,部分人甚至要借助银行贷款方可实现,经济压力也由此变沉重起来。" }, "work": { "work_index": "100分", "work_txt": "2024年处女在工作过程中,很多领域都会让他们觉得失望,不过偶尔也会尝到成功的滋味,这又会让其重新燃起希望之火。工作方面一定要找到自己很擅长,并且特别感兴趣的领域,这样才能沿着这个方向不断前行,从而让自己变得愈发强悍。如果从事了特别讨厌的行业,将很难有勇气坚持到底,甚至中途考虑放弃,还有可能长时间处于失业的状态中。2024年处女必须要在职场内部树立良好的员工形象,平时穿衣打扮要得体,千万不要一天到晚浓妆艳抹或者邋里邋遢,这样不仅会给身边人留下很不好的印象,也没有办法升职加薪。" } } }}
本示例代码演示了接口的基础调用流程,开发者需自行将代码中的默认值替换为实际的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/xingzuo/get', [
'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
用户反馈
请 登录 后反馈