我刚刚在500px.com上创建了一个帐户,并希望使用他们的API:http://developer.500px.com/
但它似乎无法返回JSONP,只有JSON。
有没有办法制作一个你可以发布网址的php文件 - >让它将来自api的响应从JSON转换为JSONP,所以我可以在客户端处理它?
我很长一段时间没有写任何PHP,所以任何帮助都表示赞赏。希望你能得到这个想法,否则就会煞费苦心。感谢
答案 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
}