Tinyurl API示例 - 我做得对:D

时间:2010-01-12 15:55:46

标签: php api tinyurl

我们在应用程序中使用超长哈希来注册新用户。问题是这些哈希在一些电子邮件客户端中断 - 使链接无法使用。

我尝试使用简单的呼叫实现Tinyurl-API,但我认为它有时会超时...有时邮件无法到达用户。

我更新了代码,但现在永远不会转换URL。 Tinyurl真的这么慢还是我做错了什么? (我的意思是嘿,5秒钟在这个时代很多)

有人可以推荐我更可靠的服务吗?

我所有的错,在fopen中忘记了一个错误。但我会在这里留下这个代码示例,因为我经常看到这个样本,我觉得这样做不太可靠:

return file_get_contents('http://tinyurl.com/api-create.php?url='.$u);

这是 - 我认为完全可行的样本。我想听听改进。

static function gettinyurl( $url ) {

    $context =
        stream_context_create(
            array(
                'http' => array(
                    'timeout' => 5  // 5 Seconds should be enough
                )
            )
        );

    // get tiny url via api-create.php
    $fp = fopen( 'http://tinyurl.com/api-create.php?url='.$url, 'r', $context); // open (read) api-create.php with long url as get parameter

    if( $fp ) { // check if open was ok
        $tinyurl = fgets( $fp ); // read response

        if( $tinyurl && !empty($tinyurl) ) // check if response is ok
            $url = $tinyurl; // set response as url

        fclose( $fp ); // close connection
    }

    // return
    return $url; // return (tiny) url

}

6 个答案:

答案 0 :(得分:3)

您可能希望将urlencode()用于url参数。

建议fgets()false进行检查。然后,您可以通过比较对空字符串的响应来保存empty()函数调用,例如:

$line = fgets($fp);

if ($line !== false && $line !== '') {
    // ...
}

通常,如果函数返回不同类型的值(例如falseinteger),建议首先检查boolean的所有内容。这可能至关重要,因为0false在比较中意味着相同。由于PHP缺乏类型安全性,强烈建议始终检查类型是否相等。甚至有些文档明确建议这样做,例如在strpos()的情况下。同时,我强迫自己使用=====,同样用于`!='等等。它需要更多打字,但绝对值得努力,因为你消除了可能的陷阱。

其余代码对我来说很好。

答案 1 :(得分:0)

您可以尝试bit.ly服务。据我所知,它得到谷歌的支持。

Api

答案 2 :(得分:0)

我不知道您的哈希值到底有多长,但并非所有服务(浏览器,服务器等)都可以处理超过255个字符的URL。您可以查看php's Pack()

答案 3 :(得分:0)

很好的解决方案,第一个真的很恐怖:D

答案 4 :(得分:0)

使用“超长哈希”有什么意义,如果你立即将它缩短为7-8个字符的小字号?

没有人会因为猜测长哈希而烦恼,而是会破解这个小小的。

自己使用10个字符的哈希,并且更多比现在更安全。

答案 5 :(得分:0)

这是另一个版本:

function getTinyUrl($url)
{
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL,'http://' . 'tinyurl.com/api-create.php?url=' . $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $tinyUrl = curl_exec($ch);
    curl_close($ch);
    
    if ($tinyUrl === false) {
        throw new RuntimeException("Could not create URL");
    }
    
    return $tinyUrl;
}

我不得不拆分 tinyurl 网址,因为 SO 不允许我发布答案。