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, он отлично работает
Ответы
Ответ 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
}