将json转换为jsonp

时间:2012-03-11 12:45:34

标签: php jquery

我刚刚在500px.com上创建了一个帐户,并希望使用他们的API:http://developer.500px.com/

但它似乎无法返回JSONP,只有JSON。

有没有办法制作一个你可以发布网址的php文件 - >让它将来自api的响应从JSON转换为JSONP,所以我可以在客户端处理它?

我很长一段时间没有写任何PHP,所以任何帮助都表示赞赏。希望你能得到这个想法,否则就会煞费苦心。感谢

1 个答案:

答案 0 :(得分:4)

当然可以。 JSON和JSONP之间的唯一区别是JSONP包含一个函数名称;

{ "x": "hello" } // JSON
foo({ "x": "hello" }); // JSONP.

以最简单的形式,你最终会得到类似的东西;

<?php echo $_GET['callback']; ?>(<?php echo file_get_contents($_GET['endpoint']); ?>);

并且您希望客户像这样使用它;

http://yourserver.com/proxy.php?endpoint=https%3A%2F%2Fapi.500px.com%2Fv1%2Foauth%2Fauthorize&callback=foo

注意编码的URL和添加回调参数以了解要调用的函数。

当然,您需要有效输入;检查参数是否存在,检查endpoint传递的是否是非恶意的等等。您可能还想在服务器上缓存响应,以阻止您达到对API施加的任何限制。

对恶意输入更有弹性的东西可能看起来像;

// checks for existence, and checks the input isn't an array
function getAsString($param) {
    if (is_null($_GET[$param]) || !is_string($_GET[$param])) {
        return '';
    }

    return $_GET[$param];
}

$endpoint = getAsString('endpoint');
// check callback is only alpha-numeric characters
$callback = preg_replace('/[^\w\d]/', '', getAsString('callback'));
// check the endpoint is for the 500px API
$is_api = (strpos($endpoint, 'https://api.500px.com') === 0);

if (strlen($callback) > 0 && $is_api) {
    echo $callback . '(' . file_get_contents($endpoint) . ')'
} else {
    // handle error
}