2015-10-12 52 views
-1

我有一个基于PHP瘦客户端的API,并希望为我的网站生成JSONP。当我致电网站:'http://api.mysite.com/users?callback=JSON_CALLBACK'。它返回一个带有JSON CALLBACK()的空白页面。登录到控制台时,它是未定义的。var_dump返回一个值,但JSONP不是

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($用户),通话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" 
} 
} 
+0

检查你的json的有效性:看看@“Madan Sapkota”的答案[这里](http://stackoverflow.com/questions/6041741/fastest-way-to-check-if-a-string -is-json-in-php) – 0yeoj

+0

@Paul Crovella,0yeoj问题在我的数据库表中。表格中包含土耳其字符的数据。我不明白土耳其的字符在UTF-8? – Nasuh

回答

1

无论在哪里你的HTTP响应你是否定义了一个JavaScript函数来处理JSONP响应。我假设这个函数是在你的web应用中的另一个JavaScript资源(内联或脚本)中定义的。因此,一个未定义的错误可能会导致您的JavaScript在其他地方,而不是从这段代码。

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

但是,

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

JSONP本质上是一个协商一致的跨站点脚本攻击

它会打开你的客户端应用程序更容易MITM攻击,这里对这个问题非常一个SO question

既然你最终只是返回JSON数据,而不是自定义逻辑,我会建议您尝试以下操作:用header('Content-Type: application/json);

  1. 返回的JSON编码的响应。您已经使用现有的代码非常接近了。
  2. 在JavaScript中具有相同的回调函数,即它不需要作为HTTP请求的一部分进行传递,函数名称也不需要不同。
  3. 以与客户端几乎完全相同的方式处理JSON。您需要对JavaScript进行微小的更改,因为您所做的只是将JSON对象按原样传递到函数中。