1

アップデートIV/現在のステータス:ファイルの文字エンコードは問題なく、問題の原因ではないことを別の質問で確認しました。別のサーバーに対してもテストしましたが、エラーが引き続き発生します。ただし、ローカルホストに対しては機能します。 要約すると、JSONP呼び出しはローカルホストに対して機能しますが、外部ドメインに対して実行すると、サーバーからの応答は空になります(ヘッダーなし/ http応答コードなし)。要求されたURLをコピーしてブラウザーに直接挿入すると、正しい形式(utf-8 / json)で出力が正しくなります。

フィドル: http: //jsfiddle.net/5SJvp/1/

アップデートIII:ローカルホストで正常に動作するようになりました。ただし、本番ドメインに対してまったく同じコード(クライアントとサーバーの両方)を使用しても、失敗します。サーバーからの応答は「空」です。これは、httpステータスコードを返さないことを意味します。

アップデートII:さらにデバッグを行った後、応答にhttpステータスコードが含まれていないことに気付きました。これがおそらく私の問題の原因ですか?これはサーバー側に何か問題があることを意味していると思いますが、私は一生どこにいるのかわかりません。

更新I:要求するjQueryからの切り取りが停止しているようです。

// Do send the request
// This may raise an exception which is actually
// handled in jQuery.ajax (so no try/catch here)
xhr.send( ( s.hasContent && s.data ) || null ); 

Params(Firebugから)

_   1356655864905
callback    jQuery18308375673194150332_1356655863817
p   0522
pl  12
s   false
secret  ##############################
u   request12341299

リクエスト(Firebugから)

Accept  text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language nb-no,nb;q=0.9,no-no;q=0.8,no;q=0.6,nn-no;q=0.5,nn;q=0.4,en-us;q=0.3,en;q=0.1
Connection  keep-alive
Host    localhost:8888
Referer http://localhost:8888/popup.html
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20100101 Firefox/17.0
X-Requested-With    XMLHttpRequest

元の質問:

私は一般的な問題のように思われることに苦労していますが、まだ解決策を見つけていません。jQueryを使用して非常に単純なjsonp呼び出しを実行しようとしています。問題は、a)何も起こらないか、b)サーバーからの応答が空であるということです。

$.ajaxメソッドと$.getJSONメソッドの両方を使用して、いくつかの異なるアプローチを試しました。どちらも同じ誤った結果を生成します。以下のコードを使用しても何も起こりません。Chromeデバッガーを使用すると、メソッドの途中で実行が停止するだけであることがわかります。ただし、Wiresharkを使用すると、クライアントが3ウェイハンドシェイクを実行し、データ送信の準備をしていることがわかります。これは失敗します。

callback =を削除した場合?実行されますが、応答の形式が正しくありません(または、Firebugで赤い線でマークされた応答しか表示されないため、少なくともそう思います)。

$.ajax({
     url: "http://mydomain.com/asd.php", //"http://localhost:8888/index.php",
     dataType: 'jsonp',
     type: 'GET',
     data: {p:p, u:u, s:symbols, pl:pl, secret:secret},
     contentType: "application/json; charset=utf-8",
     async: false,
     success: function(data){
        console.log("What " + data.test); 
     }, 
     error: function(data){
         console.log("failed for some reason");
     }
 }); 

サーバーコード($ callback = $ _GET ["callback"]

<?php header('content-type: application/json; charset=utf-8');
.
.
.
$data = array
(
    "message" => $message,
    "status" => $statuscode,
    "length" => strlen($message)        
);

echo $callback . '('.json_encode($data) .')';
exit;       
?>

これは、手動で入力されたサーバーの応答です。

funcName({"message":"!0b7(cb6Gv40","status":"OK","length":12})
4

6 に答える 6

1

jsfiddle / jsbinなしでこれをデバッグするのは難しいので、私の最善の提案は、リクエストを偽の静的データで動作させることです(空のJSON構造体{}で十分です)。

callback =?を追加するときにjson_encodeを記述しているため、json_encodeの使用方法に問題があるようです。param応答は壊れているように見えます。提案されたテストにより、問題がどこにあるかをより適切に診断できます。

于 2012-12-26T08:18:50.363 に答える
0

callbackjsonpのラッパー関数名のユニバーサルGETパラメーターです。callback=?jQueryリクエストで使用する場合、jQueryは?タイムスタンプ付きの何かに解析するため、常に一意の値になります。APIサーバーはjsonをこの一意の関数名でラップし、jQueryは名前を保存して、応答をアンラップするために使用できるようにします。

一部のAPIは柔軟性がなく、独自の特定の名前が必要です。この場合jsonpCallback、いずれかのオプションを使用するか$.ajax、でグローバルに設定できます。$.ajaxSetup

$.ajax APIドキュメントを参照してください:http: //api.jquery.com/jQuery.ajax/

于 2012-12-23T00:30:51.027 に答える
0

あなたのコードから始めて、私はそれをローカルにセットアップしました、そしてすべてが期待通りに働きます:

test.php:

<?php

$callback = $_GET["callback"];

$data = array
(
    "message" => 'test',
    "status" => 200,
    "length" => strlen('test')        
);

echo $callback . '('.json_encode($data) .')';
exit;

test.html

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(document).ready(function(){
  $.getJSON("http://localhost/test.php?callback=?",
    {
      whatever: 1,},
    function(data) {
      alert("hmm");
    });
});
</script>
</head>
<body>
</body>
</html>

あなたを助けることができる2つのこと:

  1. callback=?サーバーから返されたJSONが有効なJSONではないため(jsonデータを括弧で囲んでいるため)、呼び出しにinを入れないと失敗します。$.getJSONこの場合、サイレントに失敗します。エラーを確認したい場合は、$.ajax代わりにを使用してください。
  2. あなたの問題は、あなたが明らかにここでhttpsを使おうとしているという事実から来るかもしれません。少なくともChromeでは、無効な証明書を使用してhttps URLにAJAXリクエストを送信すると(ローカルホストまたはテストドメインに有効な証明書がないと思います)、コンソールにエラーが表示されます。ブラウザが「よろしいですか?」というプロンプトを表示することはありません。証明書について。

それが役に立てば幸い

于 2012-12-26T17:18:05.437 に答える
0

うーん、「Fiddler」を使用して呼び出しをデバッグしてみてください。おそらく、その空のサーバー応答は結局のところそれほど空ではありません。または、サーバーに奇妙なセキュリティ設定があり、REFERRERヘッダーをチェックして外部呼び出しをブロックしている可能性がありますか?

あなたがあなたのアプリに完全なURLを与えることができれば私はあなたのためにそれをテストすることができます=)

于 2012-12-31T11:19:12.457 に答える
0

SSL証明書を適切に設定しなかった場合、これは明らかに機能しません。

これは、httpsをhttpに変換すると正しく機能します:http://jsfiddle.net/eysEe/

var u = "test";
var p = 1234;
var symbols = false;
var pl = 16;
var secret = "c68f39913f901f3ddf44c707357a7d70";

$.ajax({
    url: "http://serve.pin2pass.com?index.php",
    dataType: 'jsonp',
    type: 'GET',
    data: {
        p: p,
        u: u,
        s: symbols,
        pl: pl,
        secret: secret
    },
    contentType: "application/json; charset=utf-8",
    async: false,
    success: function(data) {
        $('#test').text(data.message);
    },
    error: function(data) {
        $('#test').text("SDf");
    }
});

「https://serve.pin2pass.com?index.php」が危険なページにつながる場合、SSLのインストールが不適切かどうかを判断できます。たぶんあなたはそれをhttpsモードにするつもりはなかったのですか?

于 2013-01-01T04:34:46.843 に答える
0

そのため、新しいフィドルを使用すると、作業がはるかに簡単になりました。これはあなたの電話の実用的なサンプルです-

var u = "test";

var p = 1234;
var symbols = false;
var pl = 16;
var secret = "c68f39913f901f3ddf44c707357a7d70";

$.ajax({
    url: "https://serve.pin2pass.com/index.php",
    dataType: 'jsonp',
    type: 'GET',
    data: {
        p: p,
        u: u,
        s: symbols,
        pl: pl,
        secret: secret
    },
    contentType: "application/json; charset=utf-8",
    aync:true,
    success: function(data) {
        $('#test').text(data.message);
    },
    error: function(data) {
        console.log("failed for some reason");
    }
});​

jsfiddle

ここで何かを見逃していないことを願っています。私がしなければならなかった唯一の変更は、リクエストURLにあります。

https://serve.pin2pass.com?index.php

https://serve.pin2pass.com/index.php

これがそれを解決することを願っています。

于 2013-01-01T07:46:45.450 に答える