JQuery ajax вызов службы REST
Я пытаюсь сделать вызов ajax из jquery в службу отдыха. Служба остального права находится прямо из учебника блога mkyong, это: http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/
Служба работает, но когда я пытаюсь сделать вызов из jQuery, в Firebug есть код состояния 200, но в разделе ответа ничего.
Вот html-страница с вызовом ajax:
<html>
<head>
<script type="text/javascript" src="jquery-1.6.2.min.js"></script>
</head>
<body>
<button id="ajax">ajax call</button>
<button id="json">json</button>
<script type="text/javascript">
$('#json').click(function(){
alert('json');
$.getJSON("http://localhost:8080/restws/json/product/get",
function(data) {
alert(data);
});
});
$('#ajax').click(function(){
alert('ajax');
$.ajax({
type: "GET",
dataType: "json",
url: "http://localhost:8080/restws/json/product/get",
success: function(data){
alert(data);
}
});
});
</script>
</body>
</html>
Я не могу понять, где я ошибся, не могли бы вы рассказать мне, что я делаю неправильно?
Спасибо!
Ответы
Ответ 1
Вы используете свой HTML-код с другого хоста, чем хост, который вы запрашиваете. Из-за этого вы заблокированы той же политикой происхождения.
Один из способов использования JSONP. Это позволяет выполнять межсайтовые запросы.
В JSON вы будете возвращены:
{a: 5, b: 6}
В JSONP JSON завернут в вызов функции, поэтому он становится script, а не объектом.
callback({a: 5, b: 6})
Вам нужно отредактировать службу REST, чтобы принять параметр с именем callback
, а затем использовать значение этого параметра в качестве имени функции. Вы также должны изменить content-type
на application/javascript
.
Например: http://localhost:8080/restws/json/product/get?callback=process
должен выводить:
process({a: 5, b: 6})
В вашем JavaScript вам нужно будет указать jQuery для использования JSONP. Для этого вам нужно добавить ?callback=?
к URL-адресу.
$.getJSON("http://localhost:8080/restws/json/product/get?callback=?",
function(data) {
alert(data);
});
Если вы используете $.ajax
, он автоматически добавит ?callback=?
, если вы скажете ему использовать jsonp
.
$.ajax({
type: "GET",
dataType: "jsonp",
url: "http://localhost:8080/restws/json/product/get",
success: function(data){
alert(data);
}
});
Ответ 2
Из использования 8080 я предполагаю, что вы используете контейнер сервлетов tomcat для обслуживания вашего априори. Если это так, вы также можете попросить прокси-сервер вашего веб-сервера запросить контейнер сервлета.
С apache вы обычно используете mod_jk (хотя есть и другие альтернативы), чтобы обслуживать веб-сервер за портом 80 вместо 8080, который разрешил проблему с перекрестным доменом.
Это обычная практика, наличие "статического" контента в веб-сервере и динамический контент в контейнере, но оба из-за того же домена.
URL для остальных api будет http://localhost/restws/json/product/get
Здесь описано, как использовать mod_jk для подключения apache к tomcat:
http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
Ответ 3
Я думаю, что нет необходимости указывать
'http://localhost:8080`"
в части URI.. потому что. если вы укажете его, вам придется вручную его менять для каждой среды.
Только
"/restws/json/product/get" also works