4

Chrome でクロスドメインのJSONP呼び出しを実行しようとしていますが、 「Uncaught SyntaxError: Unexpected token :」 というメッセージが返されます。応答のコンテンツ タイプの変更、xhr ヘッダーの設定、JSON.stringify、ほぼほとんどここで提供されているソリューションのうち、これまでのところ何も機能していません:-(

 $.ajax({
                type: "POST",
                url: "https://www.virustotal.com/vtapi/v2/url/report",
                crossDomain: true,
                contentType: "application/json; charset=UTF-8",
                dataType: 'jsonp',
                data: {
                    apikey: "*",
                    resource: "http://www.1001freefonts.com/font/BaroqueScript.zip"
                },
                jsonp: false,
                jsonpCallback: receive,
                success: function (data, textStatus, jqXHR) {
                    console.log("Data retrieved: " + data);
                }
            }).done(function () {
                console.log('I think we are done here');
            })
        .error(function (e) {
            console.log(arguments);
            console.log('something went funny here');
        })
        .complete(function (xhr, status) {

            console.log("complete");
        if (status === 'error' || !xhr.responseText) {
            console.log('error');
        }
        else {
            console.log("data found:" + xhr.responseText);
            //...
        }
    });
    });

    function receive(saveData) {
        if (saveData == null) {
            console.log("DATA IS UNDEFINED!");  // displays every time
        }
        console.log("Success is " + saveData);  // 'Success is undefined'
    }

デバッガーで応答を確認できます

{"permalink": "https://www.virustotal.com/url/b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772/analysis/1360339512/", "url": "http://www.1001freefonts.com/font/BaroqueScript.zip", "response_code": 1, "scan_date": "2013-02-08 16:05:12", "scan_id": "b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772-1360339512", "verbose_msg": "Scan finished, scan information embedded in this object", "filescan_id": "b7e13c0242e9690aba1f3da4b73d9c2e99a9b7fd03f542b55e694a34aaf9eca8-1360339519", "positives": 0, "total": 35, "scans": {"CLEAN MX": {"detected": false, "result": "clean site"}, "MalwarePatrol": {"detected": false, "result": "clean site"}, "ZDB Zeus": {"detected": false, "result": "clean site"}, "K7AntiVirus": {"detected": false, "result": "clean site"}, "Quttera": {"detected": false, "result": "clean site"}, "Yandex Safebrowsing": {"detected": false, "result": "clean site"}, "MalwareDomainList": {"detected": false, "result": "clean site"}, "ZeusTracker": {"detected": false, "result": "clean site"}, "zvelo": {"detected": false, "result": "clean site"}, "Google Safebrowsing": {"detected": false, "result": "clean site"}, "BitDefender": {"detected": false, "result": "clean site"}, "Opera": {"detected": false, "result": "clean site"}, "G-Data": {"detected": false, "result": "clean site"}, "C-SIRT": {"detected": false, "result": "clean site"}, "Sucuri SiteCheck": {"detected": false, "result": "clean site"}, "VX Vault": {"detected": false, "result": "clean site"}, "ADMINUSLabs": {"detected": false, "result": "clean site"}, "SCUMWARE.org": {"detected": false, "result": "clean site"}, "Dr.Web": {"detected": false, "result": "clean site"}, "AlienVault": {"detected": false, "result": "clean site"}, "Malc0de Database": {"detected": false, "result": "clean site"}, "SpyEyeTracker": {"detected": false, "result": "clean site"}, "Phishtank": {"detected": false, "result": "clean site"}, "Avira": {"detected": false, "result": "clean site"}, "Antiy-AVL": {"detected": false, "result": "clean site"}, "Comodo Site Inspector": {"detected": false, "result": "clean site"}, "Malekal": {"detected": false, "result": "clean site"}, "ESET": {"detected": false, "result": "clean site"}, "SecureBrain": {"detected": false, "result": "unrated site"}, "Netcraft": {"detected": false, "result": "clean site"}, "ParetoLogic": {"detected": false, "result": "clean site"}, "URLQuery": {"detected": false, "result": "unrated site"}, "Wepawet": {"detected": false, "result": "unrated site"}, "Minotaur": {"detected": false, "result": "clean site"}}}

http://jsonlint.com/で確認したところ、有効な JSON であることがわかりました。

ここに応答ヘッダーがあります

cache-control:no-cache
content-encoding:gzip
content-length:695
content-type:application/json
date:Wed, 13 Feb 2013 12:00:33 GMT
server:Google Frontend
status:200 OK
vary:Accept-Encoding
version:HTTP/1.1

アイデアや提案はありますか?

4

3 に答える 3

3

徹底的なテストの結果、ajax が JSONP を期待している場合 (クロスドメインの制限により)、JSON オブジェクトの結果を取得できないことが明らかになりました。応答ステータス = 200 にもかかわらず。

ブラウザーによってスローされた解析エラーがあるにもかかわらず、結果がまだキャプチャできるかどうかを確認するために、jQuery AJAX 呼び出しを使用してテストしてきましたが、それは可能ではないようです。JS の作業が完了すると、ヘッダーに Response Text が到着するようです。

@Florian F. @Likwid_T @Christoph が上記で提案したように、適切に機能させるにはサーバー側スクリプトが必要です。他の開発者は、ソリューションとして C# で記述されたプロキシを使用することに熱心であるようです。

于 2013-02-15T13:27:08.427 に答える
1

クリストフは正しいです。あなたはあなたの答えをあなたのコールバック関数、あなたの場合はPHPファイルの最後に入れる必要があります:

echo $_GET['receive'] . '(' . json_encode($yourResultObject) . ');';

または、より複雑なオブジェクトが必要な場合

echo $_GET['receive'] . '(' . json_encode(array(name1 => object1, name2 => object2, name3 => object3)) . ');';

少し調整する必要があるかもしれませんが、基本的に予期しないトークンを取得するたびに、ほとんどの場合、jQueryがコールバック関数を取得できない構文エラーになります。

于 2013-02-13T13:17:36.030 に答える
1

JSONPはそのままでは機能しません。

JSONPは、結果をスクリプトタグにロードすることで、クロスドメイン制限をバイパスします。

基本的に、サーバーはJSONP対応である必要があります。

応答を送信する直前に、サーバー側で実行する必要があることをすべて実行します。

  1. リクエストに「_callback」が設定されているかどうかを確認します
  2. 設定されている場合は、コンテンツを_callbackの値でラップします。
  3. データを送信する

PHPのコード例:

$responseString = '{"smthing":"val","smthingelse":"val2"}';
if (isset($_REQUEST['_callback'])) {
    $responseString = $_REQUEST['_callback'] . '(' . $responseString . ');';
}

正しい引数を使用して「完了」無名関数を実行します。(JQueryは他のすべてを処理します)

于 2013-02-13T13:01:46.253 に答える