JSONP を介してクロスドメイン ユーザー データを取得しようとしていますが、PHP と jQuery を介して異なる結果を得ています。まず、PHP を介して生成された JSONP を次に示します (適切なヘッダー ('Content-type: application/json; charset=utf-8' ) が渡されます)。
hsAuthCallback({"planID":4,"memberPlan":"EMPLOYEE","memberName":"Fred"});
私はそれを取得するために2つの方法を試しています。最初はjQueryです。
$(function() {
$.ajax({
type: 'GET',
url: 'https://url.com/path_to_file',
jsonpCallback: 'hsAuthCallback',
contentType: "application/json",
dataType: 'jsonp',
success: function(data) {
$('#jsOutput').text( JSON.stringify(data) );
},
error: function(jqXHR, textStatus, errorThrown) {
console.log("error("+jqXHR+", "+textStatus+", "+errorThrown+")");
}
});
});
予想通り、戻ります:
{"planID":4,"memberPlan":"EMPLOYEE","memberName":"Fred"}
次はPHPで、問題がある場所です(関数を使用してjsonpをデコードします)
// Decode JSONP (http://felix-kling.de/blog/2011/01/11/php-and-jsonp/)
function jsonp_decode($jsonp, $assoc = false) {
if($jsonp[0] !== '[' && $jsonp[0] !== '{') {
$jsonp = substr($jsonp, strpos($jsonp, '('));
}
return json_decode(trim($jsonp,'();'), $assoc);
}
$url = 'https://url.com/path_to_file';
$jsonp = file_get_contents($url);
$plan_data = jsonp_decode($jsonp, true);
var_dump($plan_data);
戻り値:
array(3) {
["planID"]=>
int(0)
["memberPlan"]=>
string(0) ""
["memberName"]=>
string(0) ""
}
S3 で実際の json ファイルを使用してテストしましたが、動作しているようです。生成された JSONP に対する制御は限られています。何かご意見は?