Вызовы веб-службы SOAP из Javascript

Я изо всех сил пытаюсь успешно сделать вызов веб-службы веб-службе SOAP с веб-страницы. Веб-служба-это веб-служба Java, которая использует JAX-WS.

вот веб-метод, который я пытаюсь позвонить:

@WebMethod  
public String sayHi(@WebParam(name="name") String name)  
{  
    System.out.println("Hello "+name+"!");  
    return "Hello "+name+"!";  
}

Я попытался выполнить вызов веб-службы с помощью библиотеки jQuery jqSOAPClient (http://plugins.jquery.com/project/jqSOAPClient).
Вот код, который я использовал:

var processResponse = function(respObj)  
{  
    alert("Response received: "+respObj);  
};

SOAPClient.Proxy = url;  
var body = new SOAPObject("sayHi");  
body.ns = ns;  
body.appendChild(new SOAPObject("name").val("Bernhard"));

var sr = new SOAPRequest(ns+"sayHi",body);  
SOAPClient.SendRequest(sr,processResponse);

кажется, нет ответа спина. Когда в jqSOAPClient.js Я журнал xData.responseXML элемент данных я получаю "undefined". В веб-сервисе я вижу предупреждение

24 марта 2011 10:49:51 я ком.солнце.в формате XML.с WS.транспорт.протоколу HTTP.сервер.WSHttpHandler handleExchange Предупреждение: не удается обработать метод HTTP: OPTIONS

Я также пытался использовать библиотеку javascript, soapclient.js (http://www.codeproject.com/kb/Ajax/JavaScriptSOAPClient.aspx). Код на стороне клиента, который я использую здесь

var processResponse = function(respObj) 
{
    alert("Response received: "+respObj);
};

var paramaters = new SOAPClientParameters();
paramaters.add("name","Bernhard");
SOAPClient.invoke(url,"sayHi",paramaters,true,processResponse);

Я обошел часть в soapclient.js, который извлекает WSDL, так как он не работает (Я получаю:IOException: An established connection was aborted by the software in your host machine на странице услуги). WSDL извлекается только для соответствующего пространства имен, поэтому я только что заменил переменную ns на фактическое пространство имен.

Я получаю точно такое же предупреждение на веб-службе, как и раньше (не могу обрабатывать HTTP-метод: параметры), и в консоли ошибок браузера я получаю ошибку "документ равен нулю". Когда я регистрирую значение из Треб.responseXML в soapclient.js я вижу, что это null.

может ли кто-нибудь посоветовать, что может пойти не так и что я должен сделать, чтобы заставить это работать?

3 ответов


я узнал, что здесь происходило. Это тот же сценарий, что и в этом потоке:jQuery $.Аякс.$ ,)(сообщение отправки "параметры" как REQUEST_METHOD в Firefox.

в основном я использую Firefox, и когда один делает междоменный вызов (домен адреса веб-службы не совпадает с доменом веб-страницы) из Firefox с помощью AJAX, Firefox сначала отправляет HTTP-сообщение опций (прежде чем он передает сообщение POST), чтобы определить из веб-службы, если звонок должен быть разрешен или нет. Затем веб-служба должна ответить на это сообщение параметров, чтобы сообщить, позволяет ли оно выполнить запрос.

теперь предупреждение от JAX-WS ("не может обрабатывать HTTP-метод: параметры") предполагает, что он не будет обрабатывать HTTP-сообщения параметров. Это нормально-веб-сервис в конечном итоге будет работать на Glassfish. Теперь вопрос в том, как я могу настроить Glassfish для ответа на сообщение OPTIONS.

в потоке, упомянутом выше, Юха говорит, что он использует следующий код в Django:

def send_data(request):  
    if request.method == "OPTIONS":   
        response = HttpResponse()  
        response['Access-Control-Allow-Origin'] = '*'  
        response['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'  
        response['Access-Control-Max-Age'] = 1000  
        response['Access-Control-Allow-Headers'] = '*'  
        return response  
    if request.method == "POST":  
        # ... 

Access-Control-Allow-Origin дает шаблон, который указывает, какие источники (адреса получателей) будут приняты (мой может быть немного более строгим, чем просто разрешение любого источника), и Access-Control-Max-Age сообщает, Через сколько секунд клиент должен будет запросить разрешение снова.

Как это сделать в Glassfish?


вы действительно проверили, что ws работает правильно?
Вы можете использовать SoapUI для проверки запроса / ответа и т. д. Когда вы подтвердите, что ws работает с SoapUI, проверьте, что такое формат сообщения raw Soap. Затем попробуйте проверить, как это выглядит перед отправкой .метод js и сравните их.

Это может помочь вам понять, что это неправильно.


проверьте, если это helps
http://bugs.jquery.com/attachment/ticket/6029/jquery-disable-firefox3-cross-domain-magic.patch

он помечен как недопустимый
http://bugs.jquery.com/ticket/6029
но это может дать вам некоторый намек

с другой стороны, вместо того, чтобы переопределять правильные настройки для междоменных сценариев, может быть лучше, если вы можете создать и вызвать локальную страницу, которая будет делать запрос к ws и возвращать результат.
Или еще лучше, вы можете создать страницу, которая будет получать url как param и делать запрос на этот url и просто возвращать результат. Таким образом, это будет более универсальный.