Я реализую веб-службу SOAP, и она работает с вызовом cURL. Я реализовал следующий этот учебник. Сервис работает со следующей командой:
curl --header "content-type: text/xml" -d @request.xml http://localhost:8080/ws
Но, конечно, это действие должно быть свободным от командной строки и иметь возможность вызывать при необходимости, поэтому я хочу связать эту службу с действием, например, при вызове метода.
Пока я нашел в Интернете
String url = "http://localhost:8080/ws";
URL obj = new URL(url);
HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
conn.setRequestProperty("Content-Type", "text/xml");
conn.setDoOutput(true);
conn.setRequestMethod("POST");
Я предполагаю, что это должен быть метод POST, но как мне добавить «request.xml» и «--header»? Какая команда завершит вызов cURL? Или я делаю это совершенно неправильно и по долгому пути, есть ли способ попроще?
PS: У меня уже есть запущенная веб-служба, и я использую Eclipse Oxygen.
У меня есть файл и служба wsdl, я использую Eclipse Oxygen
Хорошо - похоже, вы уже прошли 80% (или больше) пути. Просто используйте Eclipse / JEE edition для создания «клиентского проекта веб-службы сверху вниз», по ссылке выше. Этот учебник также может помочь: ibm.com/developerworks/webservices/tutorials/ws-jse/index.ht ml




Добавьте строки ниже в свой код в конце, он выполнит задание.
OutputStream wr = new DataOutputStream(conn.getOutputStream());
BufferedReader br = new BufferedReader(new FileReader(new File("request.xml")));
//reading file and writing to URL
System.out.println("Request:-");
String st;
while ((st = br.readLine()) != null) {
System.out.print(st);
wr.write(st.getBytes());
}
//Flush&close the writing to URL.
wr.flush();
wr.close();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String output;
StringBuffer response = new StringBuffer();
while ((output = in.readLine()) != null) {
response.append(output);
}
in.close();
// printing result from response
System.out.println("Response:-" + response.toString());
Я получаю следующую ошибку «Конструктор BufferedReader (FileReader) не определен» для второй строки с «request.xml»
Добавьте туда полный путь к файлу @request.xml в вашем коде.
Файл находится в папке проекта на самом высоком уровне. поэтому я предполагаю, что предоставление ему простого request.xml должно работать.
"request.xml" на самом деле является строкой, я даже не могу ее скомпилировать из-за ошибки.
Это сработало, спасибо большое !!! Я просто переместил new File("requestPDF.xml") вверх, и гнида пожаловалась на библиотеку файлов, я импортировал ее, и она заработала. 20+ строк на одну простую строку! Не слишком ли много? Нет ли более короткого / простого пути? PS: Могу ли я сделать такой же вызов из Frontend html? У меня есть приложение с пружинной загрузкой.
Хотя для этой цели можно использовать HttpURLConnection, SOAPConnection был разработан для ситуаций, когда нет WSDL.
Код ниже намного проще:
SOAPConnection conn = SOAPConnectionFactory.newInstance().createConnection();
SOAPMessage msg =
MessageFactory.newInstance()
.createMessage(null, Files.newInputStream(Paths.get("request.xml")));
SOAPMessage resp = conn.call(msg, "http://localhost:8080/ws");
resp.writeTo(System.out);
Есть много способов сделать это. Но "лучшая практика": 1) получить "WSDL" службы SOAP, 2) использовать IDE (например, Eclipse или NetBeans) для создания "клиента веб-службы", затем 3) использовать автоматически сгенерированный код для создания сети сервисный звонок. Вот пример: help.eclipse.org/oxygen/…