14

私のajaxコードは

$.ajax({
    type: 'GET',
    dataType: "jsonp",
    processData: false,
    crossDomain: true,
    jsonp: false,
    url: "http://someotherdomain.com/service.svc",
    success: function (responseData, textStatus, jqXHR) {
        console.log("in");
    },
    error: function (responseData, textStatus, errorThrown) {
        alert('POST failed.');
    }
});

これはクロスドメイン ajax リクエストです。

リクエストに対して正しい応答が得られていますが、firebug で確認しているときにその応答を確認できます。

これは、firebug 応答で、Web ブラウザからこの URL にアクセスしているときに得られる応答です。

{"AuthenticateUserResult":"{\"PKPersonId\":1234,\"Salutation\":null,\"FirstName\":\"Miqdad\",\"LastName\":\"Kumar\",\"Designation\":null,\"Profile\":\"\",\"PhotoPath\":\"\/UploadFiles\/\"}"}

しかし、私はエラーが発生しています

SyntaxError: invalid label

{"AuthenticateUserResult":"{\"PKPersonId\":8970,\"Salutation\

それを機能させるために他の方法を使用する必要があるかどうか。これを phonegap+jquery モバイル アプリに実装したいと考えています。

また、私は Web サービスにアクセスできません。

Chrome Web セキュリティを無効にすると、正常に動作します

4

7 に答える 7

7

内部の JSON 構造体が文字列として渡されているようです。そのデータをオブジェクトとして取得するには、もう一度 JSON.parse() する必要があります。

try {
  responseData = JSON.parse(responseData);
}
catch (e) {}

編集:次のことを試してください:

$.ajax({
    type: 'GET',
    dataType: "json",
    url: "http://someotherdomain.com/service.svc",
    success: function (responseData, textStatus, jqXHR) {
        console.log("in");
        var data = JSON.parse(responseData['AuthenticateUserResult']);
        console.log(data);
    },
    error: function (responseData, textStatus, errorThrown) {
        alert('POST failed.');
    }
});
于 2013-06-07T17:15:32.933 に答える
6

残念ながら、この Web サービスは、別の JSON を含む JSON を返しているようです。内部の JSON のコンテンツの解析は成功しています。解決策は醜いですが、私にとってはうまくいきます。JSON.parse(...)文字列全体を変換しようとして失敗します。常に最初から答えが得られ、{"AuthenticateUserResult":興味深いデータがこの後にあると仮定すると、次のことを試してください。

$.ajax({
    type: 'GET',
    dataType: "text",
    crossDomain: true,
    url: "http://someotherdomain.com/service.svc",
    success: function (responseData, textStatus, jqXHR) {
        var authResult = JSON.parse(
            responseData.replace(
                '{"AuthenticateUserResult":"', ''
            ).replace('}"}', '}')
        );
        console.log("in");
    },
    error: function (responseData, textStatus, errorThrown) {
        alert('POST failed.');
    }
});

Web サービスから受け取った不正な形式の JSON の自動解析を防止するdataTypeことは非常に重要です。text

AuthenticateUserResult基本的に、先頭と末尾の引用符に加えて、一番上の中かっことキーを削除して、外側の JSON を一掃します。結果は整形式の JSON になり、解析の準備が整います。

于 2013-06-17T11:51:39.920 に答える
4

サーバーからの応答は JSON 文字列形式です。dataType を 'json' に設定すると、jquery はそれを直接使用しようとします。dataType を「テキスト」に設定してから、手動で解析する必要があります。

$.ajax({
    type: 'GET',
    dataType: "text", // You need to use dataType text else it will try to parse it.
    url: "http://someotherdomain.com/service.svc",
    success: function (responseData, textStatus, jqXHR) {
        console.log("in");
        var data = JSON.parse(responseData['AuthenticateUserResult']);
        console.log(data);
    },
    error: function (responseData, textStatus, errorThrown) {
        alert('POST failed.');
    }
});
于 2013-06-11T05:24:00.000 に答える
0

ここに私のコードからのスニペットがあります..それがあなたの問題を解決する場合..

クライアントコード:

jsonpCallBack を設定: 'photos' および dataType:'jsonp'

 $('document').ready(function() {
            var pm_url = 'http://localhost:8080/diztal/rest/login/test_cor?sessionKey=4324234';
            $.ajax({
                crossDomain: true,
                url: pm_url,
                type: 'GET',
                dataType: 'jsonp',
                jsonpCallback: 'photos'
            });
        });
        function photos (data) {
            alert(data);
            $("#twitter_followers").html(data.responseCode);
        };

サーバー側のコード (Rest Easy を使用)

@Path("/test_cor")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String testCOR(@QueryParam("sessionKey") String sessionKey, @Context HttpServletRequest httpRequest) {
    ResponseJSON<LoginResponse> resp = new ResponseJSON<LoginResponse>();
    resp.setResponseCode(sessionKey);
    resp.setResponseText("Wrong Passcode");
    resp.setResponseTypeClass("Login");
    Gson gson = new Gson();
    return "photos("+gson.toJson(resp)+")"; // CHECK_THIS_LINE
}
于 2014-03-31T03:13:17.573 に答える
0

「jsonp」を使用する場合、基本的には関数呼び出しでラップされたデータを返します。

jsonpCallback([{"id":1,"value":"testing"},{"id":2,"value":"test again"}])
where the function/callback name is 'jsonpCallback'.

サーバーにアクセスできる場合は、最初に応答が正しい"jsonp"形式であることを確認してください

このようなサーバーからの応答については、ajax 呼び出しでも何かを指定する必要があります。

jsonpCallback: "jsonpCallback",  in your ajax call

jsonpCallbackコールバックの名前は " " である必要はなく、例として選んだ名前にすぎませんが、サーバー側で行われる名前 (ラッピング) と一致する必要があることに注意してください。

あなたの問題に対する私の最初の推測は、サーバーからの応答が本来あるべきものではないということです。

于 2013-06-07T17:23:45.243 に答える