JQuery AJAX вызов службы REST - PullRequest
       2

JQuery AJAX вызов службы REST

45 голосов
/ 18 августа 2011

Я пытаюсь сделать 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>

Я не могу понять, где я ошибся, не могли бы вы сказать мне, что я делаю неправильно?

Спасибо!

Ответы [ 3 ]

78 голосов
/ 18 августа 2011

Вы используете HTML-код с другого хоста, отличного от запрашиваемого хоста.Из-за этого вы блокируетесь той же политикой происхождения .

Одним из способов решения этой проблемы является использование JSONP .Это позволяет выполнять межсайтовые запросы.

В JSON возвращается:

{a: 5, b: 6}

В JSONP JSON заключен в вызов функции, поэтому он становится сценарием, а неobject.

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);
   }
});
1 голос
/ 15 июля 2012

Из-за использования 8080 я предполагаю, что вы используете контейнер сервлетов Tomcat для обслуживания вашего API для отдыха.В этом случае вы также можете использовать прокси-сервер для запросов к контейнеру сервлета.

При использовании Apache вы обычно используете mod_jk (хотя есть и другие альтернативы) для обслуживания API через веб-сервер, стоящий позади.порт 80 вместо 8080, что решило бы проблему междоменных доменов.

Это обычная практика: иметь «статический» контент на веб-сервере и динамический контент в контейнере, но оба они обслуживаются из-за одного домена.

URL для остальных API будет http://localhost/restws/json/product/get

Вот описание того, как использовать mod_jk для подключения Apache к tomcat: http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

0 голосов
/ 05 ноября 2013

Я думаю, что нет необходимости указывать

'http://localhost:8080`" 

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

Только

"/restws/json/product/get" also works
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...