Краткое руководство по WebServe

задняя часть
Краткое руководство по WebServe

Эта статья участвует в "Сетевой протокол должен знать должен знать"Требуют документов

Здесь тысячи людей, спасибо, что увидели этот момент. Надеюсь, моя статья будет вам полезна!

Сохрани свою любовь и отправляйся в горы и моря в грядущие дни!

👀 Предисловие

Потому что некоторое время назад мне нужно было использовать webService для вызова других системных API-интерфейсов компании, но метод запроса отличается от знакомого мне http-запроса, он основан на протоколе soap для передачи данных в формате xml. Параметры запроса чрезвычайно сложны и должны инкапсулировать несколько уровней формата данных xml, и я не знаю, на каком языке находится API-интерфейс другой стороны или даже на какой платформе они существуют.

Так в чем же разница между этим и нашим обычным интерфейсом httpapi?

  • Различные протоколы: HTTPService основан на протоколе http, а WebService основан на протоколе мыла;
  • Различная эффективность обработки данных: HTTPService более эффективен и передает строки, а WebService упакован в более сложные объекты, чтобы он мог обрабатывать более сложные типы данных;
  • Возможна ли междоменная обработка: метод HttpService не может обрабатывать междоменную обработку.Если вы вызываете службу другого приложения, вы должны использовать webService, точно так же, как я сейчас вызываю службы других систем.

😀 Обзор

😆 Представляем

WebService — это в основном программная служба, предоставляемая в Интернете через протокол SOAP, который описан документами WSDL и зарегистрирован через UDDI. WebService — это технология удаленного вызова на разных языках программирования и платформах операционных систем, которая позволяет различным приложениям, работающим на разных машинах, обмениваться данными или интегрироваться друг с другом без помощи дополнительного специализированного стороннего программного или аппаратного обеспечения. Приложения, реализованные в соответствии со спецификацией WebService, могут обмениваться данными друг с другом независимо от используемого ими языка, платформы или внутреннего протокола.

Итак, если вы хотите использовать разные языки, разные платформы, разные места и хотите передавать данные, правильно выбрать WebService по собственной рекомендации!

🔄 Многомерное понимание

  • На первый взгляд, WebService — это прикладная программа, которая предоставляет API, который можно вызывать через Интернет, то есть приложение можно вызывать через Интернет программно. Мы называем приложение, которое вызывает этот WebService, клиентом, а приложение, предоставляющее WebService, называется сервером.
  • На внутреннем уровне WebService — это не технология, а скорее новая платформа, основанная на взаимодействующих распределенных приложениях, платформа, набор стандартов и спецификация. Он определяет, как приложения могут достичь интероперабельности в Интернете.Вы можете писать веб-службы на любом языке, который вам нравится, и на любой платформе, если мы можем запрашивать и получать доступ к этим службам через стандарт веб-службы.

👩‍👧‍👦 Три хороших брата

Часто сопровождается тремя братьями по элементам: UDDI, WSDL, SOAP.

  • UDDI: UDDI — это технология описания, обнаружения и интеграции веб-служб, а также важная часть стека протоколов веб-службы. С помощью UDDI предприятия могут динамически находить и использовать веб-службы в соответствии со своими потребностями, а также могут динамически публиковать свои собственные веб-службы в реестре UDDI для использования другими пользователями. UDDI использует механизм сообщений SOAP (стандартный XML/HTTP) для публикации, редактирования, просмотра и поиска регистрационной информации. Он использует формат XML для инкапсуляции различных типов данных и отправляет их в центр регистрации или возвращает необходимые данные центром регистрации.

  • WSDL: это формат XML для описания публикации веб-сервисов. Это язык, основанный на XML (подмножество стандартного универсального языка разметки), который предоставляет документ с формальным описанием в машиночитаемом виде для описания WebService и его функций, параметров и возвращаемых значений. Поскольку он основан на XML, WSDL может читаться как машиной, так и человеком.

  • SOAP: простой протокол доступа к объектам, спецификация протокола для обмена данными, представляет собой облегченный, простой протокол, основанный на подмножестве стандартного универсального языка разметки XML. Он в основном состоит из протокола Http и формата данных XML. Когда WebService отправляет запросы и получает результаты по протоколу HTTP, содержимое отправленного запроса и содержимое результата инкапсулируются в формате XML, а некоторые определенные заголовки сообщений HTTP добавляются для описания формата содержимого сообщения HTTP.Эти конкретные заголовки сообщений HTTP и XML Формат содержимого — протокол SOAP. SOAP предоставляет стандартные методы RPC (технология удаленного вызова) для вызова WebService.

😎 Преимущества выбора

  1. Кроссплатформенный вызов.
  2. Межъязыковые звонки.
  3. Удаленный вызов.

😜 Приступим

Нечего сказать, смотреть слишком много теории не так хорошо, как делать небольшую демонстрацию самостоятельно. Итак, начнем!

Сделайте демонстрацию погодной системы, клиент отправляет название города, а сервер отвечает соответствующей погодой.

📖 Создайте пустой проект

Создайте пустой проект WeatherServer, я использую версию IDEA 2020.3. Конечно, я буду вдаваться в подробности в начале.

🍉 Внедрить сервер публикации

1. Создадим серверный модуль weatherServerTest

Процесс создания в основном такой же. Если вы хотите использовать меня, то я предлагаю вам сначала создать сервер, чтобы другие могли получить к нему доступ, или можно использовать чужие серверы. Здесь сначала будет создан модуль на стороне сервера, а последующее создание модуля на стороне клиента в основном аналогично. Здесь мы можем напрямую выбрать проект Maven или самостоятельно выбрать общий проект Java. JDK может быть популярным JDK8.

Окончательный пустой сервер модулей выглядит следующим образом:

2. Обеспечить службу погоды

Следующим шагом является разработка серверного кода. Предоставляет простой городской погодный сервис.

  1. Определение бизнес-интерфейса погоды IWeatherService

    код показывает, как показано ниже:

    package com.ws.service;
    
    public interface IWeatherSerice {
        /**
         * 通过城市名得到对应的天气
         * @param city 城市
         * @return 天气
         */
        public String queryWeather(String city);
    }
    
  2. Напишите соответствующий класс реализации интерфейса WeatherServiceImpl

    Соответствующий код выглядит следующим образом:

    package com.ws.service.impl;
    
    import com.ws.service.IWeatherSerice;
    import javax.jws.WebService;
    
    @WebService  // 用该注解修改表示当前类是一个服务类 必须加上的,不然启动服务的时候会报错。
    public class WeatherServiceImpl implements IWeatherSerice {
    
        @Override
        public String queryWeather(String city) {
            // 这里直接返回对应的城市和晴天!!!
            return city + "的天气为:晴天!";
        }
    }
    
  3. Создайте класс WeatherServerDemo для публикации сервисов.

    Соответствующий код выглядит следующим образом:

    package com.ws.server;
    
    import com.ws.service.impl.WeatherServiceImpl;
    import javax.xml.ws.Endpoint;
    
    public class WeatherServerDemo {
    
        public static void main(String[] args) {
            /**
             * address: 服务地址 --> 提供访问的地址
             * implementor: 服务类  --> 提供访问的接口的实现类
             */
            Endpoint.publish("http://localhost:8086/weatherServer", new WeatherServiceImpl());
            System.out.println("服务发布成功");
        }
    }
    
  4. Запустите основной метод для запуска службы:

    Вы видите в консоли, он не закрывался после запуска и показывал, что сервис успешно опубликован. Далее взгляните на наши опубликованные услуги в Интернете.

3. Доступ к Услугам

Получите доступ к адресу, который вы только что указали, плюс ?wsdl, например:http://localhost:8086/weatherServer?wsdl

Итак, как читать этот документ wsdl? Не бойтесь, позвольте мне научить вас нескольким важным частям, чтобы понять их с первого взгляда! Примечание: документацию wsdl необходимо просматривать снизу вверх.

  • : имя представления службы, конечная точка службы WebService.
  • : протокол связи веб-служб, а также описывает методы, ввод и вывод веб-служб.
  • : описывает операции, которые может выполнять WebService, указывая на portType через привязку.
  • : описывает методы, опубликованные в службе, включая параметры, возвращаемые значения и т. д.
  • : определяет типы данных, используемые в WebService

Посетите подробную страницу параметров:http://localhost:8086/weatherServer?xsd=1

🍊 Несколько способов добиться клиентского доступа

1. Создайте клиентский модуль WeatherClientTest.

структура:

2. Сгенерируйте соответствующий клиентский код

Зачем нужно скачивать клиентский код?Во-первых, в первых двух способах нужно использовать интерфейс серверного кода, а потом если вы обращаетесь к удаленному серверу, то не сможете получить к нему доступ.

Здесь будет представлена ​​команда, поставляемая с jdk: wsimport

wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).
wsimport.exe位于JAVA_HOME\bin目录下 
常用参数为:
        -d<目录>  - 将生成.class文件。默认参数。
        -s<目录> - 将生成.java文件。
        -p<生成的新包名> -将生成的类,放于指定的包下
wsimport -s ./ http://localhost:8086/weatherServer?wsdl

Шаги сборки:

  • Перейдите в каталог java src клиентского модуля.

  • В этом каталоге перейдите в режим командной строки и введитеwsimport -s ./ http://localhost:8086/weatherServer?wsdl, загрузите код сервера, который только что был запущен. Примечание. Этот шаг должен гарантировать, что сервер находится в доступном состоянии.

  • Структура конечного сгенерированного кода в структуре IDEA:

Полученный здесь код может взаимно однозначно соответствовать имени, соответствующему документу wsdl. Конечно, если вы хотите изменить имя пакета, вы можете использовать параметр -p.

3. Метод клиентского доступа 1

Первый способ: через полученный код вызывается сервисный метод.

Структура выглядит следующим образом:

код показывает, как показано ниже:

package com.ws.client;

import com.ws.service.impl.WeatherServiceImpl;
import com.ws.service.impl.WeatherServiceImplService;

public class WeatherClientDemo1 {
    public static void main(String[] args) {
        // 1. 创建服务视图
        WeatherServiceImplService weatherServiceImplService = new WeatherServiceImplService();

        // 2. 得到服务实现类
        WeatherServiceImpl weatherService = weatherServiceImplService.getPort(WeatherServiceImpl.class);

        // 3. 调用接口的方法
        String result = weatherService.queryWeather("广州");

        // 4. 返回远程访问得到的结果 --> result = 广州的天气为:晴天!
        System.out.println("result = " + result);
    }
}

В конце концов, результаты, которые мы получаем после запуска, соответствуют ожидаемым:

4. Метод клиентского доступа 2

Какие недочеты на предыдущем шаге, должно быть предельно ясно: мы зафиксировали адрес службы, и если мы хотим изменить адрес службы, нам может понадобиться сгенерировать код заново.

Итак пишем адрес сервиса, структура такая:

код показывает, как показано ниже:

package com.ws.client;

import com.ws.service.impl.WeatherServiceImpl;
import com.ws.service.impl.WeatherServiceImplService;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;

public class WeatherClientDemo2 {
    public static void main(String[] args) throws Exception {
        // 1. 设置访问的服务端地址
        URL url = new URL("http://localhost:8086/weatherServer?wsdl");
        
         /*
            2.设置服务名称和命名空间
             namespaceURI: wsdl的命名空间(targetNamespace)
             localPart: 是服务视图的名称(service的name值)
         */
        QName qName = new QName("http://impl.service.ws.com/", "WeatherServiceImplService");
        
        // 3. 生成服务视图
        Service service = Service.create(url, qName);
        
        // 4. 得到服务视图的实现类 --> WeatherServiceImpl
        WeatherServiceImpl weatherServiceImpl = service.getPort(WeatherServiceImpl.class);

        // 5. 调用接口方法得到结果! --> result = 深圳的天气为:晴天!
        String result = weatherServiceImpl.queryWeather("深圳");
        System.out.println("result = " + result);
    }
}

Где находятся эти соответствующие параметры в расположении wsdl? Смотрите, на что я вам указываю:

Этот второй метод является наиболее часто используемым методом и рекомендуется в первую очередь!

5. Способ клиентского доступа 3

Если вам не нужно загружать код сервера, вы можете получить доступ к серверу через HTTPURLConnection. Просто код здесь относительно длинный, и вам нужно определить строку XML и проанализировать строку самостоятельно.

  1. Добавьте пакет зависимостей dom4j в файл pom.xml.

    <dependencies>
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.1</version>
        </dependency>
    
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
    

    Структура выглядит следующим образом:

  2. Создайте соответствующую тестовую демонстрацию, примерная структура выглядит следующим образом:

    Код выглядит следующим образом: Вы можете скопировать его в IDEA и внимательно посмотреть.

    package com.ws.client;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Node;
    
    import java.io.DataOutputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Scanner;
    
    public class WeatherClientDemo3 {
        public static void main(String[] args) throws Exception {
            // 1. 设置访问的服务端地址
            URL url = new URL("http://localhost:8086/weatherServer?wsdl");
    
            // 2.打开一个通向服务地址的连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
            // 3.设置参数, --> POST必须大写,否则抛出异常
            connection.setRequestMethod("POST");
            // 这里是text/xml不是text/html
            connection.setRequestProperty("content-Type", "text/xml;charset=utf-8");
    
            // 4.设置输入输出,默认是false没有读写的权限
            connection.setDoOutput(true);
            connection.setDoInput(true);
    
            // 5.组织SOAP数据,发送请求
            String soapXml = getXmlString("佛山");
            System.out.println("soapXml = " + soapXml);
    
            // 6. 将数据写入到输出流中
            DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
            dos.write(soapXml.getBytes("utf-8"));
            dos.flush();
    
            // 7. 判断远程访问是否成功,如果响应码为200即为成功
            if (connection.getResponseCode() == 200) {
                // 8. 获取相应的输入流,得到对应的结果
                InputStream ips = connection.getInputStream();
                Scanner scanner = new Scanner(ips);
                StringBuffer buffer = new StringBuffer();
                while (scanner.hasNextLine()) {
                    buffer.append(scanner.nextLine());
    
                }
                scanner.close();
                // 得到为xml字符串
                System.out.println("buffer = " + buffer);
                // 9. 解析xml字符串获得返回的字符串
                String xml = parseXmlToString(buffer);
                System.out.println("xml = " + xml);
    
            }
        }
    
        private static String parseXmlToString(StringBuffer buffer) {
            try {
                // 得到对应的文档对象
                Document document = DocumentHelper.parseText(buffer.toString());
                // "//"从任意位置的节点上选择名称为 item 的节点。
                Node node = document.selectSingleNode("//return");
                return node.getText();
    
            } catch (DocumentException e) {
                e.printStackTrace();
    
            }
            return null;
        }
    
        private static String getXmlString(String string) {
            String xml = "<?xml version=\"1.0\" ?>"
                    + "<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">"
                    + "<S:Body>" + "<ns2:queryWeather xmlns:ns2=\"http://impl.service.ws.com/\">"
                    + "<arg0>" + string
                    + "</arg0>" + "</ns2:queryWeather>" + "</S:Body>"
                    + "</S:Envelope>\"";
            return xml;
    
        }
    }
    
  3. Полученные результаты:

    Видно, что соответствующие результаты могут быть получены.

6. Три способа сравнения

  1. Первый способ: хотя код относительно прост, он имеет высокую степень связанности и может быть применен только к адресу загруженного в данный момент сервера. Как правило, после запуска сервера методы и параметры интерфейса сильно не меняются. Но если адрес изменится, код сервера нужно загрузить заново.
  2. Второй метод: на основе первого метода извлеките адрес доступа к серверу, чтобы мы могли настроить соответствующий адрес доступа к службе в файле конфигурации, таком как файл xml.После того, как его необходимо изменить, требуется только файл конфигурации адрес доступа.
  3. Третий способ: ему не нужно скачивать код сервера и обращаться к серверу удаленно через HTTPURLConnection, а нужно самому сгенерировать xml-строку, а потом результат нужно парсить самому. Как только параметр входящей строки xml окажется неправильным, ответ завершится ошибкой или результирующая строка не будет проанализирована.
  4. Лично рекомендую второй способ, скачайте код сервера, затем напишите адрес запрашиваемого сервера и создайте соответствующий интерфейс для настройки метода. Нет необходимости писать дополнительные строки xml и анализировать строки.

😬Плюсы и недостатки

🌈Преимущества

  1. Благодаря третьему методу нашего клиента мы можем знать, что я инкапсулирую данные в формате XML, а XML является кроссплатформенным и его не нужно писать на определенном языке, поэтому я тоже кроссплатформенный.
  2. Через клиентский доступ мы можем знать, что сервер может быть удаленным или локальным, и мы можем осуществлять удаленные вызовы через протокол SOAP.

🌩️ Недостатки

Поскольку я инкапсулирую данные в формате XML, в процессе передачи может потребоваться передача дополнительных тегов, однако если теги становятся все больше и больше, производительность веб-сервиса будет снижаться.

🔥 Сценарии использования

  1. Для публикации службы (внутренней/внешней), независимо от типа клиента, языка или производительности, рекомендуется использовать WebService.

  2. Сервер решил использовать WebService, клиент не может выбирать, он должен использовать WebService.

💧 Неприменимые сценарии

  1. Когда система рассматривает производительность, не рекомендуется использовать WebService.

  2. Не рекомендуется использовать WebService в изоморфных программах (интерфейсах между системами в компании), таких как Java с использованием RMI (удаленный вызов методов), которые не нужно преобразовывать в XML-данные.

🌸Сводка

Я считаю, что у всех вас есть небольшое понимание того, как использовать веб-сервис и другие концепции и некоторые знания. Я не уверен, что многие люди используют его. Я делаю здесь только вводные упражнения. Конечно, если мы хотим интегрировать его в проект SpringBoot. Даже мы можем интегрировать связанные зависимости для использования webService, например, мы можем использовать SpringBoot для интеграции WebService с помощью CXF. Так стоит ли нам изучать эту технологию? На самом деле, я думаю, это зависит от спроса.Если нам нужно его использовать, мы можем быстро понять его, использовать небольшую демонстрацию, чтобы быстро начать работу, а затем использовать интегрированный CXF для интеграции в проект, чтобы достичь применение этой технологии к реальному проекту!

Я лично не трогал, просто потому, что в проекте нужно вызывать такой интерфейс webService, поэтому я только начинаю, а сейчас каждый веб-интерфейс в основном основан на http запросах, так что разберемся. взгляд, и обещай не страдать! ! !

Давайте сделаем все возможное вместе! Я не талантливый, если есть упущения или ошибки, тоже милости просим в талантливые людиКомментарийКритика и исправления! Конечно, если эта статья наверняка вам мало поможет, пожалуйста, также добрые и милые талантыНравится, любимыйСпустись,Одна кнопка три ссылки,Большое спасибо!

Узнал здесь, мир сегодня закрыт, спокойной ночи! Хотя эта статья закончилась, я все еще здесь и никогда не закончу. Я постараюсь продолжать писать статьи. Приезжайте в Японию надолго, не бойтесь быть медленным!

Спасибо за то, что вы здесь! Доживи до молодости и ни о чем не жалей в молодости!