Вызовы веб-службы 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 и просто возвращать результат. Таким образом, это будет более универсальный.