PHP调用新浪短链接API生成与解析长网址指南
在使用PHP进行开发时,有时需要将长网址转换为便于分享或存储的短链接,并能够随时将其还原。新浪短链接API提供了稳定的接口支持。本文将详细展示如何利用PHP内置的cURL功能,通过封装函数来实现长链接缩短和短链接展开的功能,涵盖请求头设置、参数过滤、JSON数据解析及安全错误处理。
核心功能与准备条件
要实现长链接的转换,我们需要依赖以下几个基础条件:
- 环境要求:服务器需开启
cURL扩展(PHP默认通常已启用)。 - App Key:新浪短链接API需要使用应用的
App Key作为身份标识。示例中使用了测试用的Key,实际生产环境中应替换为你在新浪开放平台申请的有效Key。 - API地址:
- 缩短链接接口:
http://api.t.sina.com.cn/short_url/shorten.json - 展开链接接口:
http://api.t.sina.com.cn/short_url/expand.json
- 缩短链接接口:
第1步:封装cURL通用请求方法
为了避免代码重复,首先创建一个通用的HTTP请求函数。该函数负责初始化连接、设置超时、指定返回格式(JSON)并执行请求。
- 目的:统一网络请求入口,便于维护。
- 关键参数:
CURLOPT_URL设置目标地址,CURLOPT_HTTPHEADER指定内容类型为 JSON,CURLOPT_RETURNTRANSFER确保返回字符串而非直接输出。
<?php
// 定义 App Key (请替换为有效的应用App Key)
define('SINA_APPKEY', '31641035');
function curlQuery($url) {
// 设置附加HTTP头,告知服务端我们期望接收JSON数据
$addHead = array(
"Content-type: application/json"
);
// 初始化curl会话
$curl_obj = curl_init();
// 设置请求URL
curl_setopt($curl_obj, CURLOPT_URL, $url);
// 设置HTTP头
curl_setopt($curl_obj, CURLOPT_HTTPHEADER, $addHead);
// 不输出返回的HTTP头信息
curl_setopt($curl_obj, CURLOPT_HEADER, 0);
// 将结果作为字符串返回,而不是直接输出
curl_setopt($curl_obj, CURLOPT_RETURNTRANSFER, 1);
// 设置超时时间(秒),防止请求挂起
curl_setopt($curl_obj, CURLOPT_TIMEOUT, 15);
// 执行请求
$result = curl_exec($curl_obj);
// 检查是否有错误
if(curl_errno($curl_obj)){
$error_msg = curl_error($curl_obj);
curl_close($curl_obj);
return false; // 或者抛出异常
}
// 关闭curl会话
curl_close($curl_obj);
return $result;
}
?>
第2步:URL预处理与格式化
在发送请求前,必须对原始URL进行规范化处理。新浪API对URL格式有严格要求,缺少协议头或不规范的编码会导致请求失败。
/**
* 过滤并格式化URL
*/
function filterUrl($url = '') {
$url = trim(strtolower($url));
// 去除可能存在的 http:// 前缀,统一处理
$url = trim(preg_replace('/^http:\/\/', '', $url));
if ($url == '') {
return false;
}
// 重新添加协议头并进行URL编码,防止特殊字符破坏API请求
return urlencode('http://' . $url);
}
第3步:实现长链接缩短功能
调用 shorten.json 接口。将处理后的长链接拼接到查询参数中,发起GET请求,并解析返回的JSON数据提取短链接。
/**
* 根据长网址获取短网址
*/
function sinaShortenUrl($long_url) {
// 构建API请求URL
$api_url = 'http://api.t.sina.com.cn/short_url/shorten.json';
$query_params = [
'source' => SINA_APPKEY,
'url_long' => filterUrl($long_url)
];
// 拼接完整URL
$final_url = $api_url . '?' . http_build_query($query_params);
// 发起请求
$result = curlQuery($final_url);
if (!$result) {
return false;
}
// 解析JSON响应
$json = json_decode($result);
// 检查API是否返回错误信息
if (isset($json->error) || !isset($json[0]->url_short) || $json[0]->url_short == '') {
// 可选:记录错误日志
// error_log(json_encode($json));
return false;
}
// 返回短链接
return $json[0]->url_short;
}
第4步:实现短链接展开功能
使用相同的逻辑,调用 expand.json 接口,传入短链接获取原始的长链接。
/**
* 根据短网址获取长网址
*/
function sinaExpandUrl($short_url) {
$api_url = 'http://api.t.sina.com.cn/short_url/expand.json';
$query_params = [
'source' => SINA_APPKEY,
'url_short' => $short_url
];
$final_url = $api_url . '?' . http_build_query($query_params);
$result = curlQuery($final_url);
if (!$result) {
return false;
}
$json = json_decode($result);
// 校验返回值
if (isset($json->error) || !isset($json[0]->url_long) || $json[0]->url_long == '') {
return false;
}
return $json[0]->url_long;
}
第5步:组合使用与调用示例
将上述函数整合后,可以在业务逻辑中轻松完成双向转换。以下是一个简单的使用流程:
<?php
// 1. 定义原始长链接
$long_url = 'https://www.example.com/some/very/long/path?param=value';
// 2. 转换为短链接
$short_url = sinaShortenUrl($long_url);
if ($short_url) {
echo "Original: " . $long_url . "\n";
echo "Short: " . $short_url . "\n";
// 3. 验证展开功能
$verify_long = sinaExpandUrl($short_url);
echo "Verified Long: " . $verify_long . "\n";
} else {
echo "Failed to shorten URL. Check App Key and Network.";
}
?>
注意事项与排错
- App Key有效性:如果返回JSON中包含
error字段(如 "invalid app key"),请检查SINA_APPKEY是否正确且未被禁用。 - 网络延迟:建议设置合理的
CURLOPT_TIMEOUT,避免因新浪服务器响应慢导致脚本超时终止。 - URL编码:务必使用
urlencode()或http_build_query()处理参数,特别是当URL中包含中文或特殊符号时。
以上就是PHP调用新浪短链接API生成与解析长网址的详细内容,更多关于PHP API编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









