var_dump返回一个值但JSONP没有

时间:2015-10-12 22:13:24

标签: php json slim

我有一个基于Php Slim Framework的API,想为我的网站生成JSONP。当我打电话给网站:'http://api.mysite.com/users?callback=JSON_CALLBACK'。它返回一个空白页面,上面写着JSON CALLBACK()。登录到控制台时,它是未定义的。

API的index.php

<?php
require 'vendor/autoload.php';

$app = new \Slim\Slim();
$app->contentType('application/json');
$app->get('/users', 'getUsers');
$app->run();

function getConnection() {
$dbhost="localhost";
$dbuser="";
$dbpass="";
$dbname="";
$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

return $dbh;
}

function getUsers() {
$sql = "select * FROM manga";
try {
$db = getConnection();
$stmt = $db->query($sql);
$users = $stmt->fetchAll(PDO::FETCH_OBJ);
$db = null;
echo $_GET['callback'] . '('.json_encode($users).')';
}
catch(PDOException $e) {
echo $_GET['callback'] . '('.json_encode($e->getMessage()).')';
}
}

var_dump($ users),呼叫http://api.mysite.com/users,结果为:

function getUsers() {
$sql = "select * FROM manga";
$db = getConnection();
$stmt = $db->query($sql);
$users = $stmt->fetchAll(PDO::FETCH_OBJ);
var_dump($users);
}

结果:

array(2) {
[0]=>
object(stdClass)#35 (10) {
["id"]=>
string(1) "1"
["ad"]=>
string(6) "Naruto"
["yazar"]=>
string(17) "Masashi KISHIMOTO"
["icerik"]=>
string(28) "Ninja, Dövü?, Aksiyon, Drama"
["tarih"]=>
string(4) "1999"
["tur"]=>
string(5) "Manga"
["durum"]=>
string(9) "Sona Erdi"
["konu"]=>
string(560) "Yondaime Hokage, gizli bir ninja kasabas? olan Konohagakure'ye sald?ran cehennemin iblislerinden Kyuubi'yi durdurmak için, Onu yeni do?mu? bir çocuk olan Naruto'nun içine mühürler. Böylece kahram?n?m?z Naruto ortaya ç?km?? olur. ?çine mühürlenen korkunç iblis sebebiyle kasaba halk?n?n nefretini kazanan Naruto daha bebekken yetim kalm?? biridir. Kasaba halk?n?nda kendini d??lamas?ylada oldukça yaramaz ve haylaz biri çocuk olur. Fakat ninja akademisinden mezun olaca?? gün, hayat?nda ilk defa olarak arkada? edinmesi Naruto'nun hayat?n? bütünüyle de?i?tirir."
["kapak"]=>
string(10) "naruto.jpg"
["son"]=>
string(3) "300"
}
[1]=>
object(stdClass)#36 (10) {
["id"]=>
string(1) "2"
["ad"]=>
string(9) "One Piece"
["yazar"]=>
string(12) "Eiichiro ODA"
["icerik"]=>
string(32) "Macera, Komedi, Dövü?, Fantastik"
["tarih"]=>
string(4) "1997"
["tur"]=>
string(5) "Manga"
["durum"]=>
string(12) "Devam Ediyor"
["konu"]=>
string(881) "Korsan Kral Gold Roger, bu dünyadaki her?eyi elde eder ve idam edilirken, tüm servetinin Grand Line'da oldu?unu, onu aray?p bulmalar? gerekti?ini söyler. Bu olaydan sonra herkes Grand Line'a gider. Ancak Grand Line'a girmek çok zor, Grand Line'da canl? kalabilmek imkans?zd?r.

Kahraman?m?z Monkey D. Luffy'nin rüyas?, Korsan Kral olmak ve One Piece denen kimsenin bilmedi?i, görmedi?i hazineyi ele geçirmektir. Küçük ya?lardan beri hep korsan olmak isteyen Luffy, kazara bir ?eytan meyvas? (Akuma No Mi) yemi?tir. 3 farkl? ?eytan meyvas? vard?r ve bu meyvalar yiyenlere çok üstün güçler sa?lamaktad?r ancak bu güçlerin bedeli asla yüzememektir. Luffy'nin yedi?i meyva onu bir lastik çocu?a çevirir. Bu olaydan y?llar sonra Luffy denize aç?l?r. Yolculu?u s?ras?nda ekibini toplayacak ve One Piece'i bulmak için Grand Line'da birbirinden tehlikeli ve komik maceralara at?lacakt?r."
["kapak"]=>
string(13) "one_piece.jpg"
["son"]=>
string(3) "788"
}
}

1 个答案:

答案 0 :(得分:1)

否则您在HTTP响应中的哪个位置定义了一个javascript函数来处理JSONP响应。我假设此功能随后在您的Web应用程序中的另一个JavaScript资源(内联或脚本)中定义。因此,未定义的错误可能是由您的其他地方的javascript引起的,而不是来自此段代码。

要测试此功能,请加载您的网络应用并启动控制台。你可以手动运行: myCallbackFunction({field:"value"}); //一些测试JSON文档 确定回调函数是否存在。

然而

恕我直言JSONP通常是一个可怕的想法,最好由jQuery's page on the topic描述。

  

JSONP本质上是一个双方同意的跨站脚本攻击

它会打开您的客户端应用程序,以便更轻松地进行MITM攻击,在这个问题上只需SO question

由于您最终只是返回JSON数据而不是自定义逻辑,我建议您尝试以下操作:

  1. 使用header('Content-Type: application/json);返回JSON编码的响应。您已经非常接近现有代码。
  2. 在JavaScript中使用相同的回调函数,即它不需要作为HTTP请求的一部分传递,函数名称也不需要区别。
  3. 以与客户端几乎完全相同的方式处理JSON。您需要对JavaScript进行最小的更改,因为您所做的就是将JSON对象原样传递给函数。