Введение в веб-сервис
Прежде всего, давайте поговорим о том, зачем нам нужно изучать такую технологию, как webService. …
Вопрос первый
Если нашему веб-сайту необходимо предоставитьпрогноз погодыЕсли есть такая необходимость, что делать? ? ? ? ?
Функция прогноза погоды не может быть достигнута простым компонентом JS, его данные анализируются базой данных, и требуется даже спутниковое обнаружение, мы не можем построить такую базу данных для своего личного сайта.
Так как мы не можем сделать это сами, можем ли мы обратиться к кому-то другому? ? ? мыВыполняя поиск в поисковых системах, вы можете найти множество веб-сайтов, которые предоставляют прогнозы погоды, но он возвращает веб-страницу, и нам нужны только соответствующие данные.!
Мы могли бы подумать, мыМогут ли это быть просто данные, которые он возвращает, а не веб-страница, возвращаемая после обработки?? ?
С тех пор родился веб-сервис, а веб-сервис — это развертывание на веб-сервере.Он предоставляет API, который можно вызывать через Интернет для внешнего мира.. Это:Когда мы хотим получить информацию о прогнозе погоды, мы можем вызвать сервис, написанный другими, и мы можем получить результат, когда мы его вызовем.!
Вопрос второй
Однако есть несколько платформ, на которых мы пишем основной веб-сайт: Java, .net, PHP и т. д., а затемКак сервер, развернутый на веб-сервере, то есть веб-сервис, позволяет нам вызывать его на разных платформах?? ?
мы знаемТакие платформы, как java и .net, могут иметь разные базовые типы данных и сложные типы данных в своих языках, так как же их можно назвать?? ? ?
процитировать предложение
Когда вы пишете приложение для запроса к базе данных, вы не думаете о том, почему результат запроса может быть возвращен вышестоящему приложению, и даже не думаете, что это то, что должна делать база данных. база данных общается с другим приложением по протоколу TCP/IP.Результат программной связи, а что это за прикладная программа верхнего уровня и какой язык используется, сама база данных не знает, она знает только, что получила протокол, который является стандартным протоколом запросов SQL92.
Будь то платформа Java, .net, PHP и т. д.,Поскольку разработка веб-страницы может осуществляться через протокол http, а возвращаемые данные являются общими, мы уже изучили такую технологию [XML].
таквеб-сервис на самом деле http+XML
Понимание веб-сервиса.
WebService, как следует из названия, представляет собой веб-службу. Он использует веб-метод (HTTP) для получения и ответа на определенные запросы от внешних систем. Это позволяет осуществлять удаленные вызовы.
Мы можем вызвать веб-службу для запроса информации о погоде в Интернете, а затем встроить ее в нашу программу (программу C/S или B/S), когда пользователь увидит информацию о погоде из нашей сети, он подумает, что мы за Он предоставляет множество информационных услуг, но по сути мы ничего не делаем, просто вызываем кусок кода на сервере.
Learning WebService может опубликовать ваш сервис (фрагмент кода) в Интернете, чтобы другие могли вызывать его, или вы можете вызвать WebService, опубликованный на чужих машинах, точно так же, как используя свой собственный код.
Обзор сокета
Мы уже знаем о подключении Scoket в главе об изучении основ сетевого программирования на Java.
Сокет-сервер
public class SocketSer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(6666);
boolean flag = true;
while (flag) {
//接收客户端的请求
System.out.println("监听客户端的数据:");
Socket sc = ss.accept();
InputStream is = sc.getInputStream();
byte[] buffer = new byte[1024];
int len = -1;
len = is.read(buffer);
String getData = new String(buffer, 0, len);
System.out.println("从客户端获取的数据:" + getData);
//业务处理 大小写转化
String outPutData = getData.toUpperCase();
//向客户端写数据
OutputStream os = sc.getOutputStream();
os.write(outPutData.getBytes("UTF-8"));
//释放资源
os.close();
is.close();
sc.close();
}
ss.close();
}
}
Сокет-клиент
public class SocketClient {
public static void main(String[] args) throws Exception {
//获取用户输入的数据
Scanner input = new Scanner(System.in);
System.out.println("请输入数据:");
String inputData = input.nextLine();
//开启一个Socket端口
Socket sc = new Socket("127.0.0.1", 6666);
OutputStream os = sc.getOutputStream();
os.write(inputData.getBytes());
//获取服务端回传的数据
InputStream is = sc.getInputStream();
byte[] buffer = new byte[1024];
int len = -1;
len = is.read(buffer);
String getData = new String(buffer, 0, len);
System.out.println("从服务端获取的数据:" + getData);
//是否流
is.close();
os.close();
sc.close();
}
}
Когда мы вводим данные от клиента, сервер преобразует данные в верхний регистр.
На самом деле, протокол HTTP основан на Socket для его инкапсуляции, мы также можем получить к нему доступ в браузере IE, мы также можем получить данные!
Краткое введение в Socket и HTTP
Семиуровневая модель ISO: физический уровень, уровень канала передачи данных, сетевой уровень, транспортный уровень, уровень представления, сеансовый уровень, прикладной уровень.
-
Доступ к сокету:Сокет относится к транспортному уровню, является реализацией протокола Tcp/ip, включая TCP/UDP, является основой всех коммуникационных протоколов, протокол Http требует поддержки сокета и использует сокет в качестве основы.
-
Особенности связи через сокет:
- Откройте порт, связь является длительной связью,Его легко перехватить брандмауэр, и его можно реализовать через механизм сердцебиения, который сложно разработать.
- Передаваемые данные, как правило, представляют собой строку, которая плохо читается.
- порт сокета не так просто продвигать
- Производительность оптимальна по сравнению с другими протоколами связи
-
Доступ к протоколу Http: протокол, принадлежащий прикладному уровню, который инкапсулирует сокет
- Кроссплатформенность
- Передача данных недостаточно дружелюбна
- Для услуг, предоставляемых сторонними приложениями, предполагается открыть интерфейс службы для внешнего мира.проблема:
-
**数据封装不够友好 :可以用xml封装数据 **
-
**希望给第三方应用提供web方式的服务 (http + xml) = web Service**
термины, связанные с веб-службой
- Существительное 1: XML.Extensible Markup Language- Расширяемый язык разметки
- XML для передачи форматированных данных является основой веб-сервисов.
- пространство имен - пространство имен.
- xmlns="http://itcast.cn" использует пространство имен по умолчанию.
- xmlns:itcast="http://itcast.cn" использует пространство имен с указанным именем.
- Существительное 2: WSDL -WebService Description Language– Язык описания веб-служб.
- Указывает, где находится служба в формате XML - адрес.
- Опишите в XML, какие методы предоставляет служба и как ее вызывать.
- существительное 3:SOAP-Simple Object Access Protocol(Простой протокол доступа к объектам)
- SOAP — это основанный на XML протокол для передачи данных через Интернет.
- SOAP = на основе данных HTTP + XML.
- SOAP основан на HTTP.
- Состав SOAP следующий:
- Конверт - Обязательная часть. Появляется как корневой элемент XML.
- Заголовки - по желанию.
- Тело - обязательно. В разделе body содержится серверный метод для выполнения. и данные отправляются на сервер.
Быстрый старт
Первым делом попробуем вызвать написанный другими webService для опыта: заходимwoohoo.Web XML.com.capability/this_capability/index…
Залезай
Когда мы вводим номер, он может запросить информацию о местоположении нашего мобильного телефона:
Все, что нам нужно сделать сейчас, этоЭтот сервис также можно вызывать в наших собственных приложениях, то как это сделать? ? ?
Доступ к веб-сервису по http-get
public void get(String mobileCode ,String userID ) throws Exception{
URL url=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode="+mobileCode+
"&userID="+userID);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){ //结果码=200
InputStream is=conn.getInputStream();
//内存流 ,
ByteArrayOutputStream boas=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=is.read(buffer))!=-1){
boas.write(buffer, 0, len);
}
System.out.println("GET请求获取的数据:"+boas.toString());
boas.close();
is.close();
}
}
POST-запрос платформы HTTP-клиента
Зачем использовать инструмент HttpClient:
- Исходный Socket основан на транспортном уровне.Теперь WebService, к которому мы хотим получить доступ, основан на HTTP и принадлежит уровню приложения, поэтому наша связь Socket должна использовать HttpClient для отправки HTTP-запросов, так чтоформат, чтобы соответствовать
Шаги для использования HttpClient следующие:
- Создайте экземпляр HttpClient
- Создайте экземпляр какого-либо метода подключения, в данном случае GetMethod. Передайте адрес для подключения в конструкторе GetMethod
- Настройте параметры для передачи и информацию заголовка сообщения.
- Вызовите метод execute экземпляра, созданного на первом шаге, чтобы выполнить экземпляр метода, созданный на втором шаге.
- Читать строку по ответу
- Отпустите соединение. Соединение должно быть разорвано независимо от успешного выполнения метода.
//2.Post请求 :通过Http-Client 框架来模拟实现 Http请求
public void post(String mobileCode ,String userID) throws Exception{
/**HttpClient访问网络的实现步骤:
* 1. 准备一个请求客户端:浏览器
* 2. 准备请求方式: GET 、POST
* 3. 设置要传递的参数
* 4.执行请求
* 5. 获取结果
*/
HttpClient client=new HttpClient();
PostMethod postMethod=new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo");
//3.设置请求参数
postMethod.setParameter("mobileCode", mobileCode);
postMethod.setParameter("userID", userID);
//4.执行请求 ,结果码
int code=client.executeMethod(postMethod);
//5. 获取结果
String result=postMethod.getResponseBodyAsString();
System.out.println("Post请求的结果:"+result);
}
//2.Post请求 :通过Http-Client 框架来模拟实现 Http请求
public void soap() throws Exception{
HttpClient client=new HttpClient();
PostMethod postMethod=new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");
//3.设置请求参数
postMethod.setRequestBody(new FileInputStream("c:/soap.xml"));
//修改请求的头部
postMethod.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
//4.执行请求 ,结果码
int code=client.executeMethod(postMethod);
System.out.println("结果码:"+code);
//5. 获取结果
String result=postMethod.getResponseBodyAsString();
System.out.println("Post请求的结果:"+result);
}
wsimport
Выше мы используем метод GET или используем фреймворк Http-Client для вызова службы веб-сервиса, На самом деле эти два метода также имеют недостатки.
- Затруднительно передавать параметры [метод get пишется по адресу запроса, а метод post нужно инкапсулировать по одному]
- Результат синтаксического анализа вызывает затруднения [анализировать строку в соответствии с возвращенным XML]
еслиМы можем передать весь объект, и если возвращаемый результат более удобен, просто используйте веб-службу так же, как мы обычно вызываем классы Java.!
Java также предоставляет аналогичный метод,Превратите службу веб-сервиса в класс Java и позвольте нам вызывать ее самостоятельно., так как это класс Java, то нам очень удобно его использовать!
Превратить службу веб-службы в класс Java и позволить нам самим вызывать ее на самом делеJava помогает нам создать локальный прокси, а затем получить доступ к веб-сервису через локальный прокси.
Быстрый старт
wsimport — это команда, которая поставляется с Java.Если мы хотим использовать эту команду, мы должныНастроить переменные среды,иВерсия jdk предпочтительно 1.7 или выше
Стоит отметить, что:Версия JDK, созданная ide, должна совпадать с локальной версией, сгенерированной wsimport, иначе она не будет использоваться! ! !
- wsimport использует:За командой wsimport следует URL-адрес WSDL.грамматика
wsimport [opations] <wsdl_uri>
-
wsdl_uri:wsdl 的统一资源标识符
-
d :指定要输出的文件的位置
-
s :表示要解析java的源码 ,默认解析出的是class字节码
-
p : 指定输出的包名
-
Для начала вернём путь cmd на рабочий стол:
Затем создайте локальный прокси для файла WSDL.
Локальный агент на самом деле представляет собой набор файлов байт-кода.
Упакуйте полученный файл байт-кода в jar, далее нам нужно только импортировать jar-пакет в проект, и мы сможем вызывать его!
грамматика
jar cvf test.jar【jar包的名称】 打包目录
Первоначально я хотел сгенерировать пакет jar из файла класса локального агента, а затем импортировать его в среду idea, а затем просто вызвать его напрямую.Но идея всегда сообщала, что соответствующий класс не может быть найден, и я не мог найти его после долгих поисков, что очень раздражало.! ! ! ! Я рассматривал следующие ситуации
- ** JVM сгенерированного файла класса не соответствует среде JVM по идее [это не сработает, если вы переключите его позже]**
- Причина кэширования идей состоит в том, чтобы удалить все кэши идей.
- Сгенерированное локальное имя пакета прокси cn не работает [? ? ? Идея состоит в том, чтобы сообщить об ошибке имени пакета cn, а затем я не могу изменить его на собственное имя пакета]
В итоге я так и не смог найти способ.Если знаете причину, то расскажите в комментариях.... Поэтому в этом тестовом импорте я не только сгенерировал файлы байткода класса, но и сгенерировал файлы .java . Я просто использовал файл java, чтобы проверить его напрямую.
Создайте локальный агент в каталоге zhongfucheng и принесите с собой исходный код Java.
Поэтому я скопировал исходный код Java в свой проект и использовал исходный код Java для тестирования.
Разобрать WSDL
Некоторые студенты могут задаться вопросом, почему wsimport может быть таким мощным.http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL
Такой URL-адрес генерирует локальный прокси, на самом деле мы знаем его, глядя на файл WSDL.
Стоит отметить, что локальный прокси имеет только свои методы и классы и не может разрешать конкретную реализацию. Конкретная операция фактически выполняется веб-службой. Понятие прокси более понятно.
пользовательский веб-сервис
Мы использовали wsimport для создания локального прокси-сервера для вызова службы веб-службы в предыдущей главе, на самом делеНаши собственные веб-приложения также могут публиковать веб-сервисы.
Если мы публикуем веб-сервис, то другие также могут вызывать наш собственный веб-сервис!
Итак, как нам настроить веб-сервис и опубликовать его? ? ?
После jdk 1.6 **поддержка веб-сервиса предоставляется через пакет jax-ws**
- Этот метод объявляет веб-сервис посредством аннотации
- Публикация веб-сервисов через jdk EndPoint.publish()
Быстрый старт
Напишите сущность:
public class Phone {
private String name;//操作系统名
private String owner;//拥有者
private int total;//市场占有率
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}
Опубликуйте сервис, сделайте файл WSDL более читабельным с помощью аннотаций...
package cn.it.ws.d;
import cn.it.ws.model.Phone;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
/*
*手机的业务类,该业务类通过webservice 对外提供服务
* 1. 声明: @webservice
* 2. 发布 EndPoint
*/
@WebService (serviceName="PhoneManager",//修改服务名
targetNamespace="http://dd.ws.it.cn") //修改命名空间 ,默认包名,取反
//声明该业务类 对外提供webservice服务 ,默认只是对public 修饰的方法对外以webservice形式发布
public class PhoneService {
/**@WebMethod(operationName="getMObileInfo"): 修改方法名
* @WebResult(name="phone"):修改返回参数名
* @WebParam(name="osName"):修改输入参数名
*/
@WebMethod(operationName="getMObileInfo")
public @WebResult(name="phone") Phone getPhoneInfo(@WebParam(name="osName")String osName){
Phone phone=new Phone();
if(osName.endsWith("android")){
phone.setName("android");phone.setOwner("google");phone.setTotal(80);
}else if(osName.endsWith("ios")){
phone.setName("ios");phone.setOwner("apple");phone.setTotal(15);
}else{
phone.setName("windows phone");phone.setOwner("microsoft");phone.setTotal(5);
}
return phone;
}
@WebMethod(exclude=true)//把该方法排除在外
public void sayHello(String city){
System.out.println("你好:"+city);
}
private void sayLuck(String city){
System.out.println("好友:"+city);
}
void sayGoodBye(String city){
System.out.println("拜拜:"+city);
}
protected void saySayalala(String city){
System.out.println("再见!"+city);
}
public static void main(String[] args) {
String address1="http://127.0.0.1:8888/ws/phoneService";
// String address2="http://127.0.0.1:8888/ws/phoneManager";
/**
* 发布webservice服务
* 1.address:服务的地址
* 2:implementor 服务的实现对象
*/
Endpoint.publish(address1, new PhoneService());
// Endpoint.publish(address2, new PhoneService());
System.out.println("wsdl地址 :"+address1+"?WSDL");
}
}
- Добавьте аннотацию @WebService в класс, чтобы опубликовать службу WebService.
- Опубликуйте веб-службу через EndPoint (служба конечной точки). Конечная точка также является классом, предоставляемым jdk, предназначенным для служб публикации.Его метод публикации получает два параметра: один — адрес локальной службы, а другой — класс, предоставляющий службу. Он находится в пакетах javax.xml.ws.*.
- Статический метод Endpoint.publish (адрес строки, средство реализации объекта) создает и публикует конечную точку по заданному адресу для указанного объекта средства реализации.
- После добавления в класс аннотации @WebService все нестатические методы в классе будут опубликованы
- Если вы хотите, чтобы метод не был доступен публике, вы можете добавить @WebMethod(exclude=true) к методу, чтобы он не был доступен публике.
- Если класс снабжен аннотацией @WebService, у класса должен быть хотя бы один метод, который можно открыть, иначе он не запустится. защищенные, частные, окончательные, статические методы не могут быть выставлены на всеобщее обозрение
@WebService // 添加了此注解,代表是一个WebService
public class HelloWorld {
// 非 static final private 方法默认会发布
public String sayHi(String name) {
return "hello" + name;
}
@WebMethod(exclude=true)
public void exclude(){
// 被注解排除的方法
}
protected void protected1(){
//受保护的方法默认不发布
}
private void private1(){
// 私有方法默认不发布
}
public static void static1(){
// static 方法默认不发布
}
public final void final1(){
// final 方法默认不发布
}
}
Сгенерированный веб-сервис доступен в браузере
протокол SOAP
В настоящее время основными протоколами WebService являются SOAP1.1 и 1.2.
- Два пространства имен различны.
- Пространство имен Soap1.1:
- xmlns:soap="http://schemas.xmlsoap.org/soap/конверт/"
- Пространство имен Soap1.2:
-
xmlns:soap="http://www.w3.org/2003/05/soap-envelope“
-
- Пространство имен Soap1.1:
- Существуют различия в информации заголовка между SOAP1.1 и SOAP1.2.
- SOAP1.1 имеет заголовок запроса SOAPAction.
- SOAP1.2 не имеет заголовка запроса для SOAPAction.
- WSDL, созданный на основе SOAP1.1, отличается от WSDL, созданного на основе SOAP1.2. В основном смотрите на пространство имен.
- Способ запроса двух протоколов в CXF также отличается.
- 1.1 — тип содержимого: текст/xm; набор символов = UTF-8.
- 1.2 — это Content-Type:application/soap+xml;charset=UTF-8.
Концепции SOA, UDDI
SOA
Соа (Сервис-Ориентированная Архитектура):Сервис-ориентированная архитектура — это идея, которую отстаивает IBM.подключи и работай, IBM решительно выступает за, надеемсяРазрабатывайте приложения, собирая компьютеры
сочинение:
-
面向web的服务,面向web的组件 :WebService : 硬盘、cpu、内存条
-
企业服务总线 (EnterPrise Service Bus :ESB)。主板
uddi
uddi (универсальное описание, обнаружение и интеграция)Единое описание, обнаружение, интеграция
- Это служба каталогов, через которую можно регистрировать и публиковать веб-сервисы, чтобы сторонние вызывающие абоненты могли обращаться к ним единообразно.
- Много не использовал.
веб-сервис, реализующий интерфейс
Сервер
import javax.jws.WebService;
/**面向接口的webservice发布方式
*
*
*/
@WebService
public interface JobService {
public String getJob();
}
import javax.jws.WebService;
@WebService(endpointInterface="cn.it.ws.e.JobService")//设置服务端点接口 ,指定对外提供服务的接口
public class JobServiceImpl implements JobService {
@Override
public String getJob() {
return "JEE研发工程师|Android研发工程师|数据库工程师|前端工程师|测试工程师|运维工程师";
}
public void say(){
System.out.println("早上好!");
}
}
клиент
import javax.xml.ws.Endpoint;
public class Test {
public static void main(String[] args) {
JobService jobService=new JobServiceImpl();
String address="http://192.168.114.10:9999/ws/jobservice";
Endpoint.publish(address, jobService);
System.out.println("wsdl地址:"+address+"?WSDL");
}
}
CXF-фреймворк
Apache CXF — это платформа служб с открытым исходным кодом. CXF помогает создавать и разрабатывать службы. Эти службы могут поддерживать различные протоколы, такие как: SOAP, POST/HTTP, RESTful HTTP. CXF значительно упрощает службу и может быть легко интегрирован с Spring.
Введение в CXF: структура SOA
-
* cxf 是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,并且捐给了apache
-
* CxF的核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext
-
* CXF默认是依赖于Spring的
-
* Apache CXF 发行包中的jar,如果全部放到lib中,需要 JDK1.6 及以上,否则会报JAX-WS版本不一致的问题
-
* CXF 内置了Jetty服务器 ,它是servlet容器,好比tomcat
CXF-функции
- Платформа cxf, бесшовно связанная с Spring и Servlet, интегрирует контейнер сервлетов Jetty.
- Аннотации поддерживаются для публикации веб-сервисов
- Возможность отображать список сервисов для веб-сервиса
- Возможность добавлять перехватчики: входные перехватчики, выходные перехватчики:
- Перехватчик входной информации журнала, перехватчик выходного журнала, перехватчик для аутентификации пользователя
CXF-разработка
Чтобы использовать инфраструктуру CXF, сначала импортируйте пакет jar.
- asm-3.3.jar
- commons-logging-1.1.1.jar
- cxf-2.4.2.jar
- jetty-continuation-7.4.5.v20110725.jar
- jetty-http-7.4.5.v20110725.jar
- jetty-io-7.4.5.v20110725.jar
- jetty-security-7.4.5.v20110725.jar
- jetty-server-7.4.5.v20110725.jar
- jetty-util-7.4.5.v20110725.jar
- neethi-3.0.1.jar
- wsdl4j-1.6.2.jar
- xmlschema-core-2.0.jar
интерфейс
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(serviceName="languageManager")
public interface LanguageService {
public @WebResult(name="language")String getLanguage(@WebParam(name="position")int position);
}
выполнить:
package cn.it.ws.cxf.a;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
/**开发语言排行描述服务
*
*
* @author 李俊 2015年5月17日
*/
public class LanguageServiceImpl implements LanguageService {
/* (non-Javadoc)
* @see cn.it.ws.cxf.a.LanguageService#getLanguage(int)
*/
@Override
public String getLanguage(int position){
String language=null;
switch (position) {
case 1:
language="java";
break;
case 2:
language="C";
break;
case 3:
language="Objective-C";
break;
case 4:
language="C#";
break;
default:
break;
}
return language;
}
/**通过cxf框架发布webservice
* 1. ServerFactoryBean
* - 不设置注解也可以发布webservice服务, 不支持注解
* - 不支持拦截器的添加
* 2. JaxWsServerFactoryBean
* - 支持注解
* - 可以添加拦截器
* 3. webservice 访问流程:
* 1. 检测本地代理描述的wsdl是否与服务端的wsdl一致 ,俗称为握手
* 2. 通过soap协议实现通信 ,采用的是post请求 , 数据封装在满足soap规约的xml中
* 3. 返回数据 同样采用的是soap通信, 数据封装在满足soap规约的xml中
* @param args
public static void main(String[] args) {
LanguageService languageService=new LanguageServiceImpl();
ServerFactoryBean bean=new ServerFactoryBean();
//Endpoint :地址 , 实现对象
bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService");
bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
bean.setServiceBean(languageService);//服务的实现bean
bean.create();//创建,发布webservice
System.out.println("wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL");
}
*/
public static void main(String[] args) {
LanguageService languageService=new LanguageServiceImpl();
JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();
//Endpoint :地址 , 实现对象
bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService");
bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
bean.setServiceBean(languageService);//服务的实现bean
//添加输入拦截器 :输入显示日志信息的拦截器
bean.getInInterceptors().add(new LoggingInInterceptor());
//添加输出拦截器 :输出显示日志信息的拦截器
bean.getOutInterceptors().add(new LoggingOutInterceptor());
bean.create();//创建,发布webservice
System.out.println("wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL");
}
}
Интеграция CXF с Spring
- Создание веб-проекта
- Подготовьте все jar-пакеты, скопируйте все jar-пакеты из проекта CXF_HOME\lib в каталог lib нового проекта, jar-пакет Sring3.0 уже включен в него, а пакет jetty-сервера не требуется. Потому что мы хотим развернуть на сервере tomcat
- Настройте основной сервлет cxf в файле web.xml, CXFServlet
- Роль этого класса файла конфигурации Перехватывать все запросы /ws/* Аналогично фильтрам Struts2
файл конфигурации 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"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>CXF_Server</display-name>
<!-- 添加 CXF 的Servlet ,处理 webservice的请求 -->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
<!-- Spring 监听添加 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>
организация:
public class Employee {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
интерфейс:
package cn.it.ws.cxf.b;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import cn.it.ws.cxf.bean.Employee;
@WebService(serviceName="EmployeeService")
public interface EmployeeManager {
void add(@WebParam(name="employee")Employee employee);
@WebResult(name="employees")List<Employee> query();
}
Реализация интерфейса:
package cn.it.ws.cxf.b;
import java.util.ArrayList;
import java.util.List;
import cn.it.ws.cxf.bean.Employee;
/**员工管理的业务实现类
* @author 李俊 2015年5月17日
*/
public class EmployeeManagerImpl implements EmployeeManager {
private List<Employee> employees=new ArrayList<>();
@Override
public void add(Employee employee){
//添加到集合中
employees.add(employee);
}
@Override
public List<Employee> query(){
return employees;
}
}
Информация о конфигурации Spring:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<bean id="employeeManagerImpl" class="cn.it.ws.cxf.b.EmployeeManagerImpl"></bean>
<!-- 配置cxf
地址: http://192.168.114.10:8080/CXF_Server/ws/employeeManager
组成 : http://192.168.114.10:8080 +CXF_Server( 项目名)+ws(过滤的路径)+/employeeManager(自定义部分)
服务类 :
服务的实现类:
拦截器
-->
<jaxws:server address="/employeeManager" serviceClass="cn.it.ws.cxf.b.EmployeeManager">
<jaxws:serviceBean>
<ref bean="employeeManagerImpl"/>
</jaxws:serviceBean>
<!-- 配置输入显示日志信息的拦截器 -->
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxws:outInterceptors>
</jaxws:server>
</beans>
Использование веб-сервиса в IDEA
Наша идея с Intellij — очень полезная java-идея, конечно, она также поддерживает разработку веб-сервисов. Очень прост в использовании... Так как в Интернете очень много руководств, я опубликую несколько руководств, которые я считаю лучшими:
Woohoo. Масштаб против .com/article/986…
Получить прогноз погоды
Сейчас мы в основном начинаем работать с веб-сервисом.Теперь я хочу получить информацию о прогнозе погоды на веб-сайте, который я написал, поэтому я перехожу кwoohoo.Web XML.com.capability/this_capability/index…Нашел сервис прогноза погоды.
Это WSDL-адрес прогноза погоды:Я .Web XML.com. Ability/WebService - это..., то нам просто нужно разобрать службу WSDL
Если мы не хотим получать всю информацию, мы можем найти соответствующие данные, которые нам нужны, в сервисе, а именно:
Суммировать
- Причина использования веб-сервиса в том, что нам нужны некоторые сервисы, которые мы не можем написать вручную. Например, прогноз погоды, поэтому появилась технология webService.webService позволяет нам получать услуги, опубликованные другими в Интернете. Пока мы вызываем его, мы можем получить соответствующие данные.
- Сокет на самом деле является инкапсуляцией протокола TCP/IP, а в Интернете мы используем протокол HTTP. WebService также является веб-приложением. Он также, конечно, поддерживает протокол HTTP. Однако WebService необходимо использовать на разных языках, поэтому для передачи используется XML.
- Поэтому у него есть собственный протокол**: SOAP (Simple Object Access Protocol). На самом деле SOAP — это Http+XML**.
- Мы можем использовать http-get для доступа к веб-сервису, потому что он использует собственный Socket для доступа. будет немного сложно. Таким образом, мы можем использовать структуру Http-Client для доступа к WebService. Платформа Http-Client немного проще, чем метод HTTP-GET. Но все же недостаточно лаконично.
- Наконец,Мы можем использовать WsImport, поставляемый с Java, для реализации локального прокси. Этот метод преобразует WebService в класс Java, и мы можем использовать этот класс для доступа к WebService. очень полезно.
- Мы можем написать собственный веб-сервис.Аннотировать класс обслуживания. Через EndPoint (служба конечной точки) мы можем опубликовать наш класс службы webService.
- Чтобы сделать файл WDSL более удобочитаемым, вы можете использовать аннотации для записи соответствующих имен параметров.
- Вы также можете контролировать, публикуется ли метод или нет.
- SOAP на самом деле является протоколом HTTP, который использует XML для передачи.
- SOA: сервис-ориентированная архитектура. Подключи и играй. То есть сцепление очень низкое, просто добавьте его, когда будете использовать.
- UDDI (универсальное описание, обнаружение и интеграция) унифицированное описание, обнаружение и интеграция на самом деле является структурой каталогов веб-сервиса, но мы редко публикуем на нем веб-сервисы.
- Веб-сервис, реализующий интерфейс, — это просто его абстракция над классом, в этом нет ничего страшного.
- Платформа CXF может быть легко связана с Spring, поэтому нам не нужна собственная конечная точка. Он также может регистрировать такие вещи.
- Мы также можем использовать веб-сервис в разделе Idea для получения локального прокси-сервера и создания файла WSDL с помощью графического экрана.
Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом. Учащиеся, привыкшие читать технические статьи в WeChat и желающие получить больше ресурсов по Java, могутОбратите внимание на публичный аккаунт WeChat: Java3y