Эта статья участвует в "Сетевой протокол должен знать должен знать"Требуют документов
Здесь тысячи людей, спасибо, что увидели этот момент. Надеюсь, моя статья будет вам полезна!
Сохрани свою любовь и отправляйся в горы и моря в грядущие дни!
👀 Предисловие
Потому что некоторое время назад мне нужно было использовать 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.
😎 Преимущества выбора
- Кроссплатформенный вызов.
- Межъязыковые звонки.
- Удаленный вызов.
😜 Приступим
Нечего сказать, смотреть слишком много теории не так хорошо, как делать небольшую демонстрацию самостоятельно. Итак, начнем!
Сделайте демонстрацию погодной системы, клиент отправляет название города, а сервер отвечает соответствующей погодой.
📖 Создайте пустой проект
Создайте пустой проект WeatherServer, я использую версию IDEA 2020.3. Конечно, я буду вдаваться в подробности в начале.
🍉 Внедрить сервер публикации
1. Создадим серверный модуль weatherServerTest
Процесс создания в основном такой же. Если вы хотите использовать меня, то я предлагаю вам сначала создать сервер, чтобы другие могли получить к нему доступ, или можно использовать чужие серверы. Здесь сначала будет создан модуль на стороне сервера, а последующее создание модуля на стороне клиента в основном аналогично. Здесь мы можем напрямую выбрать проект Maven или самостоятельно выбрать общий проект Java. JDK может быть популярным JDK8.
Окончательный пустой сервер модулей выглядит следующим образом:
2. Обеспечить службу погоды
Следующим шагом является разработка серверного кода. Предоставляет простой городской погодный сервис.
-
Определение бизнес-интерфейса погоды IWeatherService
код показывает, как показано ниже:
package com.ws.service; public interface IWeatherSerice { /** * 通过城市名得到对应的天气 * @param city 城市 * @return 天气 */ public String queryWeather(String city); } -
Напишите соответствующий класс реализации интерфейса 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 + "的天气为:晴天!"; } } -
Создайте класс 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("服务发布成功"); } } -
Запустите основной метод для запуска службы:
Вы видите в консоли, он не закрывался после запуска и показывал, что сервис успешно опубликован. Далее взгляните на наши опубликованные услуги в Интернете.
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 и проанализировать строку самостоятельно.
-
Добавьте пакет зависимостей 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>Структура выглядит следующим образом:
-
Создайте соответствующую тестовую демонстрацию, примерная структура выглядит следующим образом:
Код выглядит следующим образом: Вы можете скопировать его в 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; } } -
Полученные результаты:
Видно, что соответствующие результаты могут быть получены.
6. Три способа сравнения
- Первый способ: хотя код относительно прост, он имеет высокую степень связанности и может быть применен только к адресу загруженного в данный момент сервера. Как правило, после запуска сервера методы и параметры интерфейса сильно не меняются. Но если адрес изменится, код сервера нужно загрузить заново.
- Второй метод: на основе первого метода извлеките адрес доступа к серверу, чтобы мы могли настроить соответствующий адрес доступа к службе в файле конфигурации, таком как файл xml.После того, как его необходимо изменить, требуется только файл конфигурации адрес доступа.
- Третий способ: ему не нужно скачивать код сервера и обращаться к серверу удаленно через HTTPURLConnection, а нужно самому сгенерировать xml-строку, а потом результат нужно парсить самому. Как только параметр входящей строки xml окажется неправильным, ответ завершится ошибкой или результирующая строка не будет проанализирована.
- Лично рекомендую второй способ, скачайте код сервера, затем напишите адрес запрашиваемого сервера и создайте соответствующий интерфейс для настройки метода. Нет необходимости писать дополнительные строки xml и анализировать строки.
😬Плюсы и недостатки
🌈Преимущества
- Благодаря третьему методу нашего клиента мы можем знать, что я инкапсулирую данные в формате XML, а XML является кроссплатформенным и его не нужно писать на определенном языке, поэтому я тоже кроссплатформенный.
- Через клиентский доступ мы можем знать, что сервер может быть удаленным или локальным, и мы можем осуществлять удаленные вызовы через протокол SOAP.
🌩️ Недостатки
Поскольку я инкапсулирую данные в формате XML, в процессе передачи может потребоваться передача дополнительных тегов, однако если теги становятся все больше и больше, производительность веб-сервиса будет снижаться.
🔥 Сценарии использования
-
Для публикации службы (внутренней/внешней), независимо от типа клиента, языка или производительности, рекомендуется использовать WebService.
-
Сервер решил использовать WebService, клиент не может выбирать, он должен использовать WebService.
💧 Неприменимые сценарии
-
Когда система рассматривает производительность, не рекомендуется использовать WebService.
-
Не рекомендуется использовать WebService в изоморфных программах (интерфейсах между системами в компании), таких как Java с использованием RMI (удаленный вызов методов), которые не нужно преобразовывать в XML-данные.
🌸Сводка
Я считаю, что у всех вас есть небольшое понимание того, как использовать веб-сервис и другие концепции и некоторые знания. Я не уверен, что многие люди используют его. Я делаю здесь только вводные упражнения. Конечно, если мы хотим интегрировать его в проект SpringBoot. Даже мы можем интегрировать связанные зависимости для использования webService, например, мы можем использовать SpringBoot для интеграции WebService с помощью CXF. Так стоит ли нам изучать эту технологию? На самом деле, я думаю, это зависит от спроса.Если нам нужно его использовать, мы можем быстро понять его, использовать небольшую демонстрацию, чтобы быстро начать работу, а затем использовать интегрированный CXF для интеграции в проект, чтобы достичь применение этой технологии к реальному проекту!
Я лично не трогал, просто потому, что в проекте нужно вызывать такой интерфейс webService, поэтому я только начинаю, а сейчас каждый веб-интерфейс в основном основан на http запросах, так что разберемся. взгляд, и обещай не страдать! ! !
Давайте сделаем все возможное вместе! Я не талантливый, если есть упущения или ошибки, тоже милости просим в талантливые людиКомментарийКритика и исправления! Конечно, если эта статья наверняка вам мало поможет, пожалуйста, также добрые и милые талантыНравится, любимыйСпустись,Одна кнопка три ссылки,Большое спасибо!
Узнал здесь, мир сегодня закрыт, спокойной ночи! Хотя эта статья закончилась, я все еще здесь и никогда не закончу. Я постараюсь продолжать писать статьи. Приезжайте в Японию надолго, не бойтесь быть медленным!
Спасибо за то, что вы здесь! Доживи до молодости и ни о чем не жалей в молодости!