2013-12-12 3 views
7

Я пытаюсь вызвать службу, которая была в другом домене из самого javascript. Я смог запросить услугу перекрестного домена. Но я не могу получить информацию из службы. Некоторые из того, как я был заблокирован одной и той же политикой происхождения. Пожалуйста, помогите мне найти ошибки в коде.Как вызвать REST Webservice из javascript с помощью предпродажного запроса?

Моя Клиентская Javascript Код:

var requestJsonData; 

function crossDomainCall(){ ** It will be called by button click ** 
    requestJsonData = createCORSRequest('POST', 'IPAddress/servicePath'); 
    if (requestJsonData){ 
     requestJsonData.onreadystatechange = handler; 
     requestJsonData.send(); 
    } 
    else { 
     alert('Cross Domain Call is not invoked'); 
    } 
} 

function handler(evtXHR) { 
    if(requestJsonData.readyState == 4) { 
     if(requestJsonData.status == 200) { 
      var response = requestJsonData.responseText; 
     } 
     else { 
      alert(" Invocation Errors Occured " + requestJsonData.readyState + " and the status is " + requestJsonData.status); 
     } 
    } 
    else { 
     alert("currently the application is at " + requestJsonData.readyState); 
    } 
} 
function createCORSRequest(method, url){ 
    var xhr; 
     xhr = new XMLHttpRequest(); 
    if ("withCredentials" in xhr){ 
     xhr.open(method, url, true); 
     xhr.setRequestHeader('X-PINGOTHER', 'pingpong'); 
    } else if (typeof XDomainRequest != "undefined"){ 
     xhr = new XDomainRequest(); 
     xhr.open(method, url); 
    } else { 
     xhr = null; 
    } 
    return xhr; 
} 

код услуги:

@OPTIONS 
@Path("/servicePath") 
@Produces("*/*") 
@Consumes("*/*") 
public Response corsRequest() { 
    Response response = null; 
    ResponseBuilder builder = null; 
    builder = Response.ok(); 
    builder.header("Access-Control-Allow-Headers", "X-PINGOTHER"); 
    builder.header("Access-Control-Max-Age","1728000"); 
    builder.header("Access-Control-Allow-Origin","Origin_Ip_Address"); 
    builder.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); 
    builder.header("Content-Type","text/plain"); 
    builder.header("Connection", "Keep-Alive"); 
    response = builder.build(); 
    System.out.println("Exited from Options method"); 
    return response; 
} 

@POST 
@Path("/servicePath") 
@Produces("application/json") 
public String drawRegions() { 
    System.out.println("Entered inside Post method"); 
      // Some calculation to arrive jsonObject. 
    return jsonObject; 
} 

Из кода, я получил следующее в качестве результатов.

OPTIONS Метод заголовков запросов и ответов

Заголовки запросов:

OPTIONS/SolartisGeoCodeLookUpService/Услуги/drawRegions HTTP/1.1

Ведущий: Cross_Domain_IP_Address

User-Agent: Mozilla/5.0 (X11, Linux x86_64; rv: 25.0) Gecko/20100101 Firefox/25.0

Accept: Текст/HTML, приложение/XHTML + XML, приложение/XML; д = 0,9, /; д = 0,8

Accept-Language: EN-US, ан; д = 0,5

Accept-Encoding: GZIP, выкачать

Происхождение: Origin_IP_Address

Access-Control-Request-метод: POST

Access-Control-Request-Headers: х-pingothe г

соединения: держать-жив

Pragma: нет кэша

Cache-Control: нет кэша

Response Headers

HTTP/1.1 200 OK

Сервер: Apache-Coyote/1.1

Access-Control-Allow-Headers: X-PINGOTHER

Connection: Keep-Alive

контроля доступа-Allow-Origin: Origin_IP_Address

Access-Control-Max-Age: 1728000

Access-Control-Allow-методы: POST, GET, OPTIONS

Content-Type: текст/обычный

Content-Length: 0

Дата: Чт, 12 Dec 2013 12:39:27 GMT

Cache Response Заголовок

Заголовки ответа из кэша

Access-Control- Разрешающая головка ... X-PINGOTHER Access-Control-Allow-Meth ... POST, GET, OPTIONS Access-Control-Max-Age 1728000 Подключение Keep-Alive Cont лор-Length 0 Content-Type текст/обычный Дата Чт, 12 декабря 2013 12:39:27 GMT сервер Apache-Coyote/1,1 контроля доступа, позволяют оригинал Origin_IP_Address

POST метод запроса и ответа Заголовки

Заголовки запросов

POST/servicePath HTTP/1.1

Хост: crossDomain_IP_Address

User-Agent: Mozilla/5.0 (X11; Linux x86_64; с.в.: 25.0) Gecko/20100101 Firefox/25.0

Accept: Текст/HTML, приложение/XHTML + XML, приложение/XML; д = 0,9, /; д = 0,8

Accept-Language: EN -US, ан; д = 0,5

Accept-Encoding: GZIP, выкачать

X-PINGOTHER: пинг-понга

Происхождение: Origin_IP_Address

Connection: Keep-жив

Pragma: нет кэша

Cache-Control: нет кэша

Content-Length: 0

Response Headers

HTTP/1 ,1 200 OK

Сервер: Apache-Coyote/1,1

Content-Type: Текст/JSON

Content-Length: 128

Дата: Чт, 12 декабря 2013 12:39:27 GMT

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ Из javascript дважды был вызван метод обработчика. В первый раз, это придет с "в настоящее время приложение на 2" - readyState значение. Во второй раз, это приключение с «Invocation Errors Occured 4 (readyState value) и кодом состояния 0 (код статуса ответа)». Во второй раз ответ ясно говорит, что вызов службы был остановлен одной политикой происхождения. Но я не знаю, как преодолеть эту проблему и получить доступ к ресурсу. Пожалуйста, помогите мне, исправив мой код.

+0

Можете ли вы использовать Logger.INFO() вместо System.out? Я думаю, что с вашей реализацией CORS должна быть проблема. Вы включили пакет внедрения CORSFilter в web.xml? –

+0

@sivatumma: Я не понял вашу точку зрения. Как включить реализацию CORSFilter в web.xml? Зачем нам это нужно в web.xml? – ArunRaj

+0

Предполагая, что оба домена закодированы вами, чтобы разрешить запрос на перекрестный поиск, ваша служба должна реализовать 'ContainerResponseFilter' и свой' public ContainerResponse фильтр (ContainerRequest req, ContainerResponse contResp) { ...} '. Вы также должны сообщить своему «web.xml», что это сервлет, которому он должен служить. –

ответ

4

Вместо того, чтобы обращаться с X-доменными вызовами в javascript, почему бы вам не создать локальную службу для вашего приложения, которая использует веб-службу в другом домене, тогда вы можете позвонить вам на локальную службу из javascript.

Я также хотел бы предложить также, что вы используете jQuery для выполнения этого кросс-доменного вызова Ajax, см. Эту ссылку: http://www.pureexample.com/jquery/cross-domain-ajax.html.

Не нужно иметь дело с XHR напрямую, так как у вас есть jQuery, чтобы сделать это за вас.

Надеюсь, это поможет,

С уважением.

+0

Я чувствую, что вызов из локальной службы - это работа. Когда мы можем позвонить из javascript в другой домен, почему мы его не используем? пожалуйста, очистите мой взгляд, если я что-то упустил. – ArunRaj

+1

Эта техника также называется веб-прокси и является обычной практикой, проверьте эту ссылку http://developer.yahoo.com/javascript/howto-proxy.html. О вызове javascript Xdomain, хорошо, что некоторые домены поддерживают этот тип вызова, его можно настроить на своих веб-серверах, как указано здесь https://www.bionicspirit.com/blog/2011/03/24/cross-domain- requests.html. –

Смежные вопросы