Java называет Webservice. Когда вы впервые свяжитесь с нами, вы подумаете, что это кошмар, особенно без единой стандартной реализации. По сравнению с реализацией веб -сервиса, которая может быть завершена на несколько этапов .NET, очень грустно видеть внедрение Java. Но даже если нам грустно, мы все равно должны его завершить. У Java также есть много хороших реализаций, таких как Xfire, Jersey, CXF. Здесь мы посмотрим на реализацию XFIRE вместе.
1) Во -первых, конечно, я должен выйти из сумки, и этот обычный человек знает это. http://xfire.codehaus.org/download Вы можете пойти сюда, вы можете пойти все или распространение. Но лучше дать ему много странных проблем, чтобы потерять уверенность.
Что мне делать, если я снял сумку? Поместите это в проект. Это кажется глупостью, но многие люди просто не знают, что делать.
Чтобы создать новый проект, я сравниваю его с Xfirewebservice, который, конечно, является веб -проектом здесь.
Я поместил все его пакеты здесь. В конце концов, когда мы пишем примеры, нет необходимости быть разборчивым. Нажмите на него случайно. Если вы хотите увидеть информацию об исключении, вы можете добавить их медленно. В будущем легко устранить ошибки, но мы не сделаем этого здесь. В конце концов, нет ничего уродливого в отсутствии каких -либо исключений, и вы можете устранить их самостоятельно.
2) Давайте сначала поймем разницу между XFIRE и другими фреймворками веб -сервиса. Самое большое отличие состоит в том, что он требует интерфейса, и если вам нужно использовать XFIRE, чтобы вызвать соответствующий веб -сервис, вы должны знать определение интерфейса. Я чувствую, что здесь есть немного ограничения. Но помимо этого, это довольно удобно для вызова веб -сервиса, как вызов местных методов. Давайте посмотрим на пример напрямую:
Прежде всего, самый важный интерфейс:
Общественный интерфейс iReaderservice {public Reader GetReader (String name, String Password); Общественный список <Reader> getReaders (); } Есть интерфейс, конечно, должен быть класс реализации, в противном случае интерфейс не будет иметь смысла. открытый класс ReaderService реализует iReaderService {public Reader GetReader (String name, String Password) {return New Reader (имя, пароль); } public List <Reader> getReaders () {list <Reader> ReaderList = new ArrayList <Reader> (); readerlist.add (новый читатель ("Shun1", "123")); readerlist.add (новый читатель ("Shun2", "123")); вернуть readerlist; }} Также взгляните на классы Javabean и Reader:
Открытый класс читатель {частный статический окончательный длинный serialversionuid = 1L; Приватное название строки; Private String Password; public Reader () {} public Reader (String name, String password) {this.name = name; this.password = пароль; } // get/set Метод опускает публичную строку toString () {return "name:"+name+", password:"+password; }}Обратите внимание, что наш класс читателей здесь реализует сериализуемый интерфейс, почему? Здесь, прежде всего, нам нужно понять принцип веб -сервиса. Для Java, если нам нужно загружать объекты в Интернете, многие люди, конечно, подумают о сериализации. Кстати, это сериализация, потому что нам нужно передать читателя в качестве параметра. Это должно быть принудительно реализовано в предыдущей версии, в противном случае сообщается об ошибке. Тем не менее, последняя версия (на самом деле, последняя также с 2007 года, потому что XFIRE прекратил развиваться и была объединена в проект CXF от Apache. Мы поговорим об этом позже) больше не нужна. Что касается того, как его реализовать, мы не будем подробно расследовать его здесь глубоко здесь, потому что он был объединен в CXF. Если мы хотим учиться в глубине, должно быть лучше изучать CXF.
3) После того, как мы завершим вышеуказанный интерфейс и написание Javabean, многие люди спросят, я вижу, что многие веб -сервисы будут иметь файлы WSDL, так как вы его получили? Прежде чем говорить об этом, давайте обсудим, что такое WSDL. Возможно, многие компании предоставляют интерфейсы, которые являются просто HTTP -адресами, возвращающими форматы XML, и наша. Это имеет одно преимущество и одно недостаток. Преимущество заключается в том, что наша разработка менее сложна, в то время как недостаток заключается в том, что нам нужно предоставить пользователям множество файлов объяснения. Что означает каждый возвращенный тег XML? Это ничто, но это просто раздражает. Что касается веб -сервиса, это недостаток в том, что мы разработали немного больше вещей, и преимущество в том, что нам не нужно писать так много файлов объяснений, потому что существует единое объяснение под названием WSDL. Это объяснительный документ о веб -сервисе, который является объединенным и одинаковым, независимо от того, какой язык, поэтому нет проблем, которую никто не может понять.
И здесь, когда мы развертываем XFIRE, это может помочь нам генерировать файлы WSDL.
Проблема в том, как его развернуть, это на самом деле просто. Мы создаем новую папку мета-инф в каталоге SRC, а затем создаем в нем папку XFIRE и создаем файл services.xml. Последующая структура заключается в следующем:
Некоторые люди могут спросить, почему нам нужно построить его в каталог SRC. На самом деле, это не предписанная сборка здесь, а потому, что нам нужно попросить инструменты разработки, чтобы помочь нам развернуть эти файлы сами, поэтому, если мы выразим его здесь, Eclipse может помочь нам развернуть его в Tomcat или других контейнерах сами. Обратите внимание, что уровень папок, в котором находится этот файл, фиксирован и не может быть изменен.
Давайте посмотрим на Services.xml напрямую:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://xfire.codehaus.org/config/1.0"> <service> <!-Название веб-сайта, вам нужно указать это при вызове-> <mame>. -> <mayspace> http: // test/helloservice </namespace> <!-класс интерфейса-> <serviceclass> com.xfire.servlet.ireaderservice </serviceclass> <!-Класс реализации-> <preprevationclass> com.xfire.servlet.readerservice </reprevationclass> </beancem. </beanservice.
Как правило, можно смотреть на комментарии.
4) Многие думают, что этого достаточно. Нет, это еще не сработало. Если вы указали это, как другие могут посетить его? Как перенаправить соответствующий запрос в XFIRE и позвольте ему обработать его. Нам нужно снова изменить web.xml.
После модификации следующее:
<? xml version = "1.0" Encoding = "utf-8"?> <web-app xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: web = "http://java.sun.com/xml/ns/javaee" xmlns: web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id = "webapp_id" версия = "3.0"> <servlet> </servlet-name> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> xfireser> <Servlet-class> org.codehaus.xfire.transport.http.xfireconfigurablableservlet </servlet> </servlet> <servlet-mapping> <servlet-name> xfireservlet </servlet-name> <url-pattern>/service/*</url-pattern> </servlet-mapping> </weble-apppay> </weble-apppay> </weble-apppay> </servlet> </weble-pattern>/*</url-pattern>
На самом деле, это просто добавление сервлета и соответствующего картирования. Далее мы напрямую вводим его в браузер:
http: // localhost: 8080/xfirewebservice/services/readerservice? WSDL
Мы можем увидеть:
Здесь отображается WSDL, который отобразит метод, который мы определяем, и возвращаемый тип. Есть объяснение WSDL позже.
5) После завершения вышеупомянутых четырех шагов мы завершили развертывание веб -сервиса. Другие могут позвонить в соответствующий веб -сервис, чтобы получить доступ к нашим методам. Давайте воспользуемся клиентом, предоставленным XFIRE для доступа к службе веб -сайта, который мы только что опубликовали:
public Class ReaderClient {public static void main (string [] args) {// здесь - создание услуги, и необходимо пропустить класс интерфейса, потому что мы должны вызвать соответствующий метод интерфейса Service srcmodel = new ObjectServiceFactory (). Create (ureaderService.class); // Агент Фабрика, здесь предназначен для создания соответствующего класса интерфейса позже xfireproxyfactory factory = new xfireproxyfactory (xfirefactory.newinstance (). Getxfire ()); // Адрес веб -сервиса, WSDL не нужно добавлять string readerserviceurl = "http: // localhost: 8080/xfirewebservice/services/readerservice"; try {// Использовать завод, чтобы вернуть соответствующий интерфейс класс ireaderservice readerservice = (ireaderservice) factory.create (srcmodel, readerserviceurl); Reader Reader = readerservice.getReader ("Shun", "123"); System.out.println (читатель); } catch (malformedurlexception e) {e.printstacktrace (); }}} Таким образом, мы видим, что вывод:
Анализ структуры файла WSDL
WSDL (язык описания веб -сервисов, язык описания веб -службы) - это приложение XML, которое определяет описание веб -службы как набор точек доступа к сервису, через которые клиенты могут получить доступ к службам, содержащим информацию о документах или вызовы процедур (аналогично вызовам удаленной процедуры). WSDL сначала абстрагирует операцию доступа и сообщение запроса/ответа, используемое во время доступа, а затем связывает ее с конкретным транспортным протоколом и форматом сообщений, чтобы в конечном итоге определить конкретную развернутую точку доступа к сервису. Точки доступа к сервису для связанных конкретных развертываний становятся абстрактными веб -службами посредством комбинации. Эта статья подробно объясняет структуру документа WSDL и анализирует роль каждого элемента.
1: определение WSDL
WSDL - это документ, используемый для точного описания веб -сервисов, а документ WSDL - это документ XML, который следует за шаблоном WSDL XML. Документ WSDL определяет веб -сервис как коллекцию точек или портов доступа к сервису. В WSDL, поскольку абстрактное определение точек и сообщений доступа к сервису было отделено от конкретного развертывания услуг или привязки формата данных, абстрактное определение можно использовать снова: сообщение относится к абстрактному описанию обмененных данных; и тип порта относится к абстрактной коллекции операций. Конкретные протоколы и спецификации формата данных для конкретных типов портов представляют собой привязку, которую можно повторно использовано. Связывая адрес доступа к веб -сайту с повторным использованием привязки, можно определить порт, и коллекция портов определяется как услуга.
Документ WSDL обычно содержит 7 важных элементов, а именно типы, импорт, сообщение, порттип, эксплуатацию, привязку и сервисные элементы. Эти элементы вложены в элемент определений, который является корневым элементом документа WSDL. Следующая часть статьи подробно представит основную структуру WSDL.
2: Основная структура WSDL-Overview
Как описано в конце первой части, базовый документ WSDL содержит 7 важных элементов. Следующее введет эти элементы и их функции.
В документе WSDL используются следующие элементы в определении веб -службы:
・ Типы - контейнер, определяемый типом данных, который использует систему определенного типа (обычно система типа в схеме XML).
・ Сообщение - абстрактный тип Определение структур данных для сообщений связи. Используйте типы, определяемые типами для определения структуры данных всего сообщения.
・ Операция - абстрактное описание операций, поддерживаемых в службе. Как правило, одна операция описывает пару сообщений запроса/ответа, которая обращается к записи.
・ Porttype - абстрактная коллекция операций, поддерживаемая определенным типом точки входа, который может быть поддержан одной или несколькими точками доступа к сервису.
・ Связывание - Связывание конкретных протоколов и спецификаций формата данных для конкретных типов портов.
・ Порт - определяется как единственная точка доступа к сервису, которая объединяет привязку к формату протокола/формата данных с конкретными адресами доступа к веб -сайту.
・ Сервис- коллекция связанных точек доступа к сервису.
Схема XML WSDL может быть названа следующим URL: http://schemas.xmlsoap.org/wsdl/
Три: Основная структура WSDL-описанное описание
В этом разделе подробно описать роль каждого элемента документа WSDL через пример. Следующим примером является содержание простого документа WSDL. Для поколения этого документа, пожалуйста, обратитесь к моей другой статье: пример разработки XFIRE-Helloworld.
Простой документ WSDL Web Service, который поддерживает уникальную операцию под названием Sayhello, которая реализуется путем запуска протокола SOAP на HTTP. Запрос принимает имя строки и возвращает простую строку после обработки. Документация заключается в следующем:
<? xml version = "1.0" Encoding = "utf-8"?> <wsdl: определения targetnamespace = "http: //com.liuxiang.xfiredemo/helloservice" xmlns: tns = "http: //com.liuxiang. xmlns: wsdlsoap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns: soap12 = "http://www.w3.org/2003/05/soap-envelope" xmlns: xsd = "http://www.w3.org/2001/xmlschema" xmlns: soapenc11 = "http://schemas.xmlsoap.org/soap/encoding/" xmlns: soapenc12 = "http://www.w3.org/2003/05/soap-encoding" xmlns: soap11 = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://com.liuxiang.xfireDemo/HelloService"> <xsd:element name="sayHello"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string" /> </xsd: последовательность> </xsd: speafftype> </xsd: element> <xsd: name = "sayhelloresponse"> <xsd: CompletsType> <xsd: последовательность> <xsd: элемент maxoccurs = "1" minoccurs = "1" name = "out" nillable = "true" type = "xsd:"/> xsd string "/> string"/> string: "/>"/xSd: "/> string"/xs. </xsd: CompletryType> </xsd: element> </xsd: схема> </wsdl: типы> <wsdl: имя сообщения = "sayhelloresponse"> <wsdl: name name = "element =" tns: sayhelloresponse "/> </wsdl: сообщение> <wslysd:" sayhelloresponse "/> </wsdl: сообщение> <wslysdl:"> "sayhellesponse"/> </wsdl: сообщение> <wslorefonseponse "/> </wsdl: сообщение> <wslyslefonse"/> </wsdl: сообщение> <wslysleponse "/> </wsdl: сообщение> <ws hame:"> " <wsdl: name part = "parameters" element = "tns: sayhello" /> < /wsdl: сообщение> <wsdl: porttype name = "helloserviceporttype"> <wsdl: операция по имени = "sayhello"> <wsdl: input = "sayHellorequest" name = "sayhelloresponse" message = "tns: sayhelloresponse"/> </wsdl: операция> </wsdl: porttype> <wsdl: привязанное имя = "helloservicehttpbinding" type = "tns: helloserviceporttype"> <wsdlsoap: binding style = "документ" документ " Transport = "http://schemas.xmlsoap.org/soap/http"/> <wsdlsoap: anage name = "sayhello"> <wsdlsoap: Operation SOAPAction = ""/> <WSDLSOAP: Operation SOOPAction = "/> <WSDLSOP: BOLDES ORDARE =" LICEL "/> </> </> <WSDLSOP: BOLDERAP ="/> </> </> <WSDLSOP: BOLDERAL "/> </> </> <WSDLSOP: BOLDERAL"/> <WSDLSOAP: Body use = "Literal"/> </wsdl: output> </wsdl: операция> </wsdl: привязка> <wsdl: имя обслуживания = "HelloService"> <WSDL: имя порта = "HelloServiceHtpport" binding = "tns: helloServicehtpbinding"> wsridsling helpbinding »> location = "http: // localhost: 8080/xfire/services/helloservice"/> </wsdl: порт> </wsdl: service> </wsdl: определения>
Элемент типов использует язык XML схемы для объявления сложных типов данных и элементов, используемых в других местах в документе WSDL;
Элемент импорта аналогичен элементу импорта в документе XML схемы и используется для импорта определений WSDL из других документов WSDL;
Элемент сообщения описывает полезную нагрузку сообщения, используя встроенный тип, комплексный тип или элемент схемы XML, определенную в элементе типа документа WSDL или определенным во внешнем документе WSDL, на который ссылается элемент импорта;
Элемент порттип и элемент работы описывает интерфейс веб -службы и определяет его методы. Элемент порттип и элемент работы аналогична декларации метода, определенной в интерфейсе Java. Элемент работы использует один или несколько типов сообщений для определения полезной нагрузки его ввода и вывода;
Элемент привязки присваивает порттип -элемент и элемент операции специальному протоколу и стилю кодирования;
Элемент службы отвечает за назначение адреса Интернета конкретному привязке;
1. Определения элементы
Клетевой элемент всех документов WSDL является элементом определений. Этот элемент инкапсулирует весь документ, предоставляя документ WSDL через свое имя. Этот элемент не имеет другой функции, кроме предоставления пространства имен, поэтому он не будет подробно описан.
Следующий код является структурой элемента определений:
<WSDL: определения TargetNamesPace = "http: //com.liuxiang.xfiredemo/helloservice" xmlns: tns = "http: //com.liuxiang.xfiredemo/helloservice" xmlns: wsdlsoap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns: soap12 = "http://www.w3.org/2003/05/soap-envelope" xmlns: xsd = "http://www.w3.org/2001/xmlschema" xmlns: soapenc11 = "http://schemas.xmlsoap.org/soap/encoding/" xmlns: soapenc12 = "http://www.w3.org/2003/05/soap-encoding" xmlns: soap11 = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: wsdl = "http://schemas.xmlsoap.org/wsdl/"> </wsdl: определения>
2. Типы элементов
WSDL принимает встроенные типы схемы W3C XML в качестве базовой системы типа. Элемент типов используется в качестве контейнера для определения различных типов данных, не описанных в встроенных типах XML схемы. При объявлении полезной нагрузки части сообщения в определении сообщения используются типы данных и элементы, определенные в элементе типа. Определения типов в этом документе WSDL:
<wsd:types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://com.liuxiang.xfireDemo/HelloService"> <xsd:element name="sayHello"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="sayHelloResponse"> <xsd: ComplexType> <xsd: последовательность> <xsd: element maxoccurs = "1" minoccurs = "1" name = "out" nillable = "true" type = "xsd: string"/> </xsd: sequence> </xsd: complextype> </xsd: element> </xsd: schema> </xsd: wsd> </wsd: wsd> </wsd: wsd> </xsd: wsd> </xsd: wsd>
Выше приведено часть определения данных, которая определяет два элемента, один из них Sayhello, а другой - SayhellorSponse:
Sayshello: определяет сложный тип, который содержит только простую строку, которая используется для описания входящей части операции в будущем;
SayShellorSponse: определяет сложный тип, который содержит только простую строку и возвращаемое значение, используемое для описания операции в будущем;
3. Импорт элементов
Импортный элемент позволяет использовать элементы определения в пространстве имен, указанных в других документах WSDL в текущем документе WSDL. Импортный элемент не используется в этом примере. Эта функция обычно очень эффективна, когда пользователи хотят модулизировать документы WSDL.
Формат импорта заключается в следующем:
<WSDL: Import namespace = "http://xxx.xxx.xxx/xxx/xxx" location = "http://xxx.xxx.xxx/xxx/xxx.wsdl"/>
Должен быть атрибут пространства имен и атрибут местоположения:
Атрибут пространства имен: значение должно соответствовать TargetNamespace, объявленным в импортном документе WSDL;
Атрибут местоположения: должен указывать на фактический документ WSDL, а документ не может быть пустым.
4. Элементы сообщения
Элемент сообщения описывает полезную нагрузку веб -службы с использованием сообщений. Элемент сообщения может описать полезную нагрузку вывода или принятие сообщения; Он также может описать содержимое заголовка файла SOAP и элемент детализации ошибки. То, как определяется элемент сообщения, зависит от использования стиля RPC или обмена сообщениями в стиле документа. В определении элемента сообщения в этой статье в этом документе используется сообщения в стиле документа:
<WSDL: имя сообщения = "SayHellorSponse"> <WSDL: name part = "Параметры" element = "tns: sayhelloresponse" /> < /wsdl: сообщение> <wsdl: имя сообщения = "sayhellorequest"> <wsdl: part name = "parameters" element = "tns: sayhello"> < /ws ws ws> < /ws ws> < /ws ws> < /ws ws> < /ws ws> < /ws ws> < /ws ws> < /ws ws ws> < /ws ws ws ws wts:
Эта часть является абстрактным определением формата сообщения: определены два сообщения SayHellorSponse и SayHelloreQuest:
SayshelloreQuest: формат сообщения запроса операции Sayhello, состоящий из фрагмента сообщения, названных параметров, а элемент является элементом в типе, который мы определили ранее;
SAYSHELLORSPONSE: Формат ответного сообщения операции Sayhello состоит из фрагмента сообщения, названных параметров, а элемент является элементом в типах, которые мы определили ранее;
Если вы используете обмен сообщениями в стиле RPC, вам нужно только изменить элемент элемента в документе для типа.
5. Портальный элемент
Элемент порттип определяет абстрактный интерфейс веб -службы. Этот интерфейс немного похож на интерфейсы Java, оба из которых определяют абстрактный тип и метод, и реализация не определена. В WSDL элемент порттипе реализуется с помощью элементов привязки и обслуживания, которые используются для иллюстрации интернет -протокола, схемы кодирования и интернет -адреса, используемого реализацией веб -службы.
Несколько операций могут быть определены в порттипе, и одна операция может рассматриваться как метод. Определение документа WSDL в этой статье:
<WSDL: Porttype name = "helloServicePortType"> <WSDL: name операции = "SayHello"> <wsdl: input name = "sayhellorequest" message = "tns: sayhellorequest" /> <wsdl: output name = "sayhelloresponse" message = "tns: sayhelloresponse" /ws> < /ws> < /ws> < /ws> < /ws> < /ws> < /ws> < /ws> < /ws> < /ws> < /ws> < /ws> ws> ws> ws> wse name = "wayhelloresponse". </wsdl: порттип>
Porttype определяет тип режима вызова службы. Он содержит метод операции Sayshello, который содержит как вход, так и вывод, чтобы указать, что операция является режимом запроса/ответа. Сообщение о запросе - это SayHelloreQuest, определенное ранее, и сообщение о ответе - SayHellorSponse, определенный ранее. Ввод представляет полезную нагрузку, доставленную в веб -службу, а выходное сообщение представляет полезную нагрузку, доставленную клиенту.
6. Переплет
Элемент привязки отображает абстрактный порттип с набором определенных протоколов (SOAO и HTTP), стилей обмена сообщениями и стилей кодирования. Обычно связывающие элементы используются вместе с запатентованными элементами протокола. Примеры в этой статье:
<WSDL: Binding name = "helloServiceHttpBinding" type = "tns: helloServicePortType"> <wsdlsoap: inding style = "document" transport = "http://schemas.xmlsoap.org/soap/http"/> SOAPAction = "" /> <wsdl: input name = "sayhellorequest"> <wsdlsoap: body use = "literal" /> < /wsdl: input> <wsdl: выходное имя = "sayhelloresponse"> <wsdlsoap: body use = "leteral" /> < /wsdl: Выход> Выход> Выход> Выход>