Преобразование cURL в Java для вызова SOAP

Я реализую веб-службу 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.

Есть много способов сделать это. Но "лучшая практика": 1) получить "WSDL" службы SOAP, 2) использовать IDE (например, Eclipse или NetBeans) для создания "клиента веб-службы", затем 3) использовать автоматически сгенерированный код для создания сети сервисный звонок. Вот пример: help.eclipse.org/oxygen/…

paulsm4 07.06.2018 18:13

У меня есть файл и служба wsdl, я использую Eclipse Oxygen

Anarkie 07.06.2018 18:21

Хорошо - похоже, вы уже прошли 80% (или больше) пути. Просто используйте Eclipse / JEE edition для создания «клиентского проекта веб-службы сверху вниз», по ссылке выше. Этот учебник также может помочь: ibm.com/developerworks/webservices/tutorials/ws-jse/index.ht‌ ml

paulsm4 08.06.2018 00:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
1 092
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Добавьте строки ниже в свой код в конце, он выполнит задание.

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»

Anarkie 08.06.2018 12:41

Добавьте туда полный путь к файлу @request.xml в вашем коде.

Red Boy 08.06.2018 12:47

Файл находится в папке проекта на самом высоком уровне. поэтому я предполагаю, что предоставление ему простого request.xml должно работать.

Anarkie 08.06.2018 13:03

"request.xml" на самом деле является строкой, я даже не могу ее скомпилировать из-за ошибки.

Anarkie 08.06.2018 13:14

Это сработало, спасибо большое !!! Я просто переместил new File("requestPDF.xml") вверх, и гнида пожаловалась на библиотеку файлов, я импортировал ее, и она заработала. 20+ строк на одну простую строку! Не слишком ли много? Нет ли более короткого / простого пути? PS: Могу ли я сделать такой же вызов из Frontend html? У меня есть приложение с пружинной загрузкой.

Anarkie 08.06.2018 13:50

Хотя для этой цели можно использовать 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);

Другие вопросы по теме