PHP调用新浪短链接API生成与解析长网址指南

花开有时
花开有时
发布时间:2026-10-14 | 5人浏览过
原创

在使用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)并执行请求。

  1. 目的:统一网络请求入口,便于维护。
  2. 关键参数: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编程的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表