6

PHPの関数で「jsonp」リクエストを解析する際に問題がありjson_decodeます。

私の質問は

a. 「jsonp」でのコールバック関数の使用は何ですか。それをオフにする必要がありますか、それとも何らかの方法で使用する必要がありますか。?

b. 「jsonp」形式で受け取った構文エラーを修正するにはどうすればよいですか?

以下に、コードと取得した応答を示します。

1. PHP の curl でサンプル URL をリクエストします

$url = 'https://ssl.domain.com/data/4564/d.jsonp';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);                
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);        
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");     
$feed = curl_exec($ch);
curl_close($ch);

echo $feed =  gzdecode($feed); // Success its displays the jsonp feed

2.次に、受信した出力を json_decode しようとしましたが、エラー no 4 がスローされ、 JSON_SYNTAX_ERROR がスローされました。これは、 jsonpの文字列型の名前が引用符で囲まれていないためだと思います。など。_ Categories_NamePosition

$json_feed = json_decode($feed);
$error = json_last_error(); 
echo $error;     // Throws error no. 4

3. URL からの RAW 'jsonp' 出力。

domain_jsonp_callback({
   Categories:[
      {
         Name:"Artifacts",
         Position:14,
         Count:70,
         ImageUrls:{
            i100:"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png",
            i120:"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png",
            i140:"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png",
            i180:"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png",
            i220:"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png",
            i280:"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png"
         }
      }
   ]
});
4

3 に答える 3

2

コールバック関数は JS 呼び出し用です。同一オリジン ポリシーを気にせずに、AJAX 方式で API を使用できます。JSONP 呼び出しが JS で使用される場合、ブラウザはAPI クライアント側で定義する必要があるコールバック関数を呼び出すだけです。

PHPコールバック関数内でJSONPを使用する場合、まったく必要ありません。サーバーが未加工の JSON タイプの呼び出しをサポートしている場合 - それを使用します。そうでない場合は、コールバック関数の文字列を削除してください。

$jsonData = json_decode(substr($feed, 22, -2));
于 2013-07-12T10:53:51.860 に答える
2

「jsonp」でのコールバック関数の使用は何ですか?それをオフにする必要がありますか、それとも何らかの方法で使用する必要がありますか? ?

JSON-P は実際には、引数付きの関数呼び出しで構成される JavaScript スクリプトです。

PHPで解析したい場合は、はい、それを取り除く必要があります。);また、最後に を剥がす必要があります。

b. 「jsonp」形式で受け取った構文エラーを修正するにはどうすればよいですか?

本当にJSONになるようにデータを修正する必要があります。あなたが持っているデータは JavaScript リテラルですが、JSON に一致する JavaScript のサブセットに準拠していません (たとえば、プロパティ名は文字列ではありませんが、そうでなければなりません)。

代わりに、ソースから実際の JSON リソースを取得することをお勧めします。

于 2013-07-12T10:54:19.690 に答える
1

それについてはわかりませんが、名前も次のように引用する必要があると思います:

domain_jsonp_callback({
   Categories:[
      {
         "Name":"Artifacts",
         "Position":14,
         "Count":70,
         "ImageUrls":{
            "i100":"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png",
            "i120":"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png",
            "i140":"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png",
            "i180":"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png",
            "i220":"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png",
            "i280":"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png"
         }
      }
   ]
});

PS: おそらく「カテゴリ」も :?

于 2013-07-12T10:48:40.630 に答える