Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Подключение к SOAP (запрос строкой) / 6 сообщений из 6, страница 1 из 1
31.10.2016, 17:02
    #39338157
drno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SOAP (запрос строкой)
Здравствуйте.

Пытаюсь написать простейший клиент на Java подключения к вебсервису SOAP.

Проверил вариант с SOAP SAAJ. Работает, НО не устраивает тем, что необходимо под каждый SOAP запрос составлять свою объектную модель SOAP.

Существуют ли другие аналогичные варианты формирования SOAP request, полностью идентичные типу SOAP SAAJ.

Попробовал это заменить

в части подготовки SOAP запроса

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
import javax.xml.soap.*;

public class SOAPClientSAAJ {

    public static void main(String args[]) throws Exception {
        // Create SOAP Connection
        SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
        SOAPConnection soapConnection = soapConnectionFactory.createConnection();

        // Send SOAP Message to SOAP Server
        String url = "http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx";
        SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);

        // print SOAP Response
        System.out.print("Response SOAP Message:");
        soapResponse.writeTo(System.out);

        soapConnection.close();
    }

    private static SOAPMessage createSOAPRequest() throws Exception {
        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();
        SOAPPart soapPart = soapMessage.getSOAPPart();

        String serverURI = "http://ws.cdyne.com/";

        // SOAP Envelope
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration("example", serverURI);

        /*
        Constructed SOAP Request Message:
        <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:example="http://ws.cdyne.com/">
            <SOAP-ENV:Header/>
            <SOAP-ENV:Body>
                <example:VerifyEmail>
                    <example:email>mutantninja@gmail.com<;/example:email>
                    <example:LicenseKey>123</example:LicenseKey>
                </example:VerifyEmail>
            </SOAP-ENV:Body>
        </SOAP-ENV:Envelope>
         */

        // SOAP Body
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("VerifyEmail", "example");
        SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("email", "example");
        soapBodyElem1.addTextNode("mutantninja@gmail.com");
        SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("LicenseKey", "example");
        soapBodyElem2.addTextNode("123");

        MimeHeaders headers = soapMessage.getMimeHeaders();
        headers.addHeader("SOAPAction", serverURI  + "VerifyEmail");

        soapMessage.saveChanges();

        /* Print the request message */
        System.out.print("Request SOAP Message:");
        soapMessage.writeTo(System.out);
        System.out.println();

        return soapMessage;
    }

}



заменить на

Код: java
1.
2.
3.
MessageFactory msgFactory = MessageFactory.newInstance();
        String reqEnv = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:example=\"http://ws.cdyne.com/\"><SOAP-ENV:Header/><SOAP-ENV:Body><example:VerifyEmail><example:email>mutantninja@gmail.com<;/example:email><example:LicenseKey>123</example:LicenseKey></example:VerifyEmail></SOAP-ENV:Body></SOAP-ENV:Envelope>";
        SOAPMessage soapMessage = msgFactory.createMessage(null, new ByteArrayInputStream(reqEnv.getBytes()));



или

Код: java
1.
2.
3.
        SOAPMessage message = MessageFactory.newInstance().createMessage();
        SOAPPart soapPart = message.getSOAPPart();
        soapPart.setContent(new StreamSource(new FileInputStream("c:\\musor\\1.xml")));



при том, что результирующий SOAP request везде одинаковый получаю в оставшихся 2-х случаях ошибку

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Server did not recognize the value of HTTP Header SOAPAction: .</faultstring>
<detail />
</soap:Fault>
</soap:Body>
</soap:Envelope>



НО работает только объектный первый способ на SAAJ.

Существуют ли способы другие аналогичные? если да, то какие, желательно с примерами или ссылками

Заранее благодарю за ответ.
...
Рейтинг: 0 / 0
31.10.2016, 17:10
    #39338167
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SOAP (запрос строкой)
Чем JAX-WS не устраивает? Я, разве, не рекомендовал его использовать в предыдущей теме? Можно ещё CXF пощупать в качестве разнообразия, если с JAX-WS что-то не так.
...
Рейтинг: 0 / 0
02.11.2016, 10:36
    #39339639
drno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SOAP (запрос строкой)
другой вариант решения

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
public static void main(String args[]) throws Exception {

        String addr = "http://ws.cdyne.com/emailverify/Emailvernotestemail.asmx";
        String request = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:example=\"http://ws.cdyne.com/\"><SOAP-ENV:Header/><SOAP-ENV:Body>\n" +
                "<example:VerifyEmail><example:email>mutantninja@gmail.com<;/example:email>\n" +
                "<example:LicenseKey>123</example:LicenseKey></example:VerifyEmail>\n" +
                "</SOAP-ENV:Body></SOAP-ENV:Envelope>";

        URL url = null;
        try {
            url = new URL(addr);
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        HttpURLConnection connection = null;
        try {
            connection = (HttpURLConnection) url.openConnection();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        connection.setRequestProperty("Content-Length", String.valueOf(request.length()));
        connection.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("SoapAction", "http://ws.cdyne.com/VerifyEmail");
        connection.setDoOutput(true);
        PrintWriter pw = null;
        try {
            pw = new PrintWriter(connection.getOutputStream());
        } catch (IOException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        pw.write(request);
        pw.flush();

        try {
            connection.connect();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        BufferedReader rd = null;
        try {
            rd = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        String line;
        String respond = "";
        try {
            respond = rd.readLine();
            while ((line = rd.readLine()) != null)
                respond = line;

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        System.out.println(respond);
    }



p.s.
предварительно конечно потребуется устрановка SOAPUi
для определения атрибутов

Код: java
1.
2.
3.
        connection.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("SoapAction", "http://ws.cdyne.com/VerifyEmail");
...
Рейтинг: 0 / 0
02.11.2016, 10:45
    #39339647
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SOAP (запрос строкой)
drno,

Используйте Apache Commons HTTPClient чтобы не плодить такое обилие говнокода.
http://svn.apache.org/repos/asf/httpcomponents/oac.hc3x/trunk/src/examples/PostSOAP.java

Я бы хотел вам посоветовать подобный подход в виде XML шаблона. Но у него есть один ключевой недостаток. Вам нужно самим заботиться о том чтобы значения ваших параметров были валидным XML и не ломали синтаксис документа.

Удивительно, конечно, как людям нравится упарываться всякой херней, в то время как JAX-WS уже давно включен в JRE. При чем не только клиент, но и сервер.
...
Рейтинг: 0 / 0
02.11.2016, 10:47
    #39339649
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SOAP (запрос строкой)
А ещё CDYNE понимает обычные HTTP запросы, так что SOAP не нужен.
...
Рейтинг: 0 / 0
02.11.2016, 15:40
    #39340060
Юрий321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SOAP (запрос строкой)
найди в каталоге с джавой wsimport, и у тебя есть а) pojo-ы, то есть модель. б) готовый клиент к сервису.

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

собирать соап запросы, собирая хмл вручную - очень неправильная идея.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Подключение к SOAP (запрос строкой) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]