Подтвердить что ты не робот

JQuery Cross Domain Ajax

Мой код 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 и при доступе к этому URL через веб-браузер

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

Но я получаю сообщение об ошибке

SyntaxError: invalid label

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

Нужно ли мне использовать какой-либо другой метод для его работы. Я хочу реализовать это в мобильном приложении phonegap + jquery.

Кроме того, у меня нет доступа к веб-сервису

Если я отключу защиту веб-браузера Chrome, он отлично работает

4b9b3361

Ответ 1

Похоже, что внутренняя структура 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.');
    }
});

Ответ 2

К сожалению, похоже, что эта веб-служба возвращает 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.');
    }
});

Очень важно, чтобы dataType должен быть text, чтобы предотвратить автоматическое разбор неправильного JSON, которое вы получаете из веб-службы.

В принципе, я удаляю внешний JSON, удаляя верхние фигурные скобки и клавишу AuthenticateUserResult вместе с ведущими и конечными кавычками. В результате получается хорошо сформированный JSON, готовый для синтаксического анализа.

Ответ 3

Ответ от сервера - это формат JSON String. Если заданный dataType как jquery json будет пытаться использовать его напрямую. Вам необходимо установить 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.');
    }
});

Ответ 4

Если вы планируете использовать JSONP, вы можете использовать getJSON, который сделал для этого. jQuery имеет вспомогательные методы для JSONP.

$.getJSON( 'http://someotherdomain.com/service.svc&callback=?', function( result ) {
       console.log(result);
});

Прочтите приведенные ниже ссылки

http://api.jquery.com/jQuery.getJSON/

Основной пример использования .ajax() с JSONP?

Основная инструкция для перекрестного домена jsonp

Ответ 5

При использовании "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", это просто имя, выбранное в качестве примера, но оно должно соответствовать имени (wrapping), выполняемому на стороне сервера.

Мое первое предположение о вашей проблеме заключается в том, что ответ с сервера не такой, какой он должен быть.

Ответ 6

Вам просто нужно проанализировать строку с помощью JSON.parse следующим образом:

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

var parsed = JSON.parse(json_result.AuthenticateUserResult);
console.log(parsed);

Здесь у вас будет что-то вроде этого:

Designation
null

FirstName
"Miqdad"

LastName
"Kumar"

PKPersonId
1234

PhotoPath
"/UploadFiles/"

Profile
""

Salutation
null

И для запроса не забудьте установить dataType:'jsonp' и добавить файл в корневой каталог вашего сайта под названием crossdomain.xml и содержащий:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<!-- Read this: www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->

<!-- Most restrictive policy: -->
<site-control permitted-cross-domain-policies="none"/>

<!-- Least restrictive policy: -->
<!--
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
-->
</cross-domain-policy>

РЕДАКТИРОВАТЬ, чтобы позаботиться о Санджай Кумар POST

Таким образом, вы можете установить функцию обратного вызова, которая будет вызываться в JSONP, используя jsonpCallback!

$.Ajax({
    jsonpCallback : 'your_function_name',
    //OR with anonymous function
    jsonpCallback : function(data) {
        //do stuff
    },
    ...
});

Ответ 7

Вот фрагменты из моего кода.. Если он решает ваши проблемы.

Код клиента:

Установите 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);
        };

Кодовый код сервера (с использованием Easy 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
}