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




soap xsd (3)

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

Это может помочь вам понять, что не так.

Я изо всех сил стараюсь сделать вызов веб-службы веб-сервису 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 данных xData.responseXML я получаю 'undefined'. В веб-службе я вижу предупреждение

24 марта 2011 10:49:51 com.sun.xml.ws.transport.http.server.WSHttpHandler handleExchange ПРЕДУПРЕЖДЕНИЕ: не удается обработать HTTP-метод: ВАРИАНТЫ

Я также попытался использовать библиотеку 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-метод: ОПЦИИ), а в консоли ошибок браузера я получаю сообщение об ошибке «document is null». Когда я регистрирую значение req.responseXML в soapclient.js, я вижу, что он равен нулю.

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


Answer #1

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

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

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


Answer #2

Я узнал, что здесь происходит. Это тот же сценарий, что и в этом потоке: jQuery $ .ajax (), $ .post отправляет «ОПЦИИ» в качестве REQUEST_METHOD в Firefox .

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

Теперь предупреждение JAX-WS («Невозможно обработать HTTP-метод: OPTIONS») предполагает, что он не будет обрабатывать HTTP-сообщения OPTIONS. Все в порядке - веб-сервис в конечном итоге будет работать на 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?





jax-ws