주제 제목이 정말 질문입니다. 왜냐하면... 나 자신도 그것이 무엇인지 모르고 처음으로 이 기사의 틀 내에서 작업하려고 노력할 것입니다. 제가 보장할 수 있는 유일한 것은 아래에 제시된 코드가 작동할 것이라는 점입니다. 그러나 제 표현은 제가 이 모든 것을 어떻게 이해하는지에 대한 가정과 추측일 뿐입니다. 그럼 가자...
소개
웹 서비스라는 개념이 탄생한 이유부터 시작해야 합니다. 이 개념이 세상에 등장했을 때, 응용 프로그램이 원격으로 상호 작용할 수 있도록 하는 기술이 이미 존재했습니다. 즉, 한 프로그램이 다른 프로그램의 메서드를 호출하여 다른 도시나 국가에 있는 컴퓨터에서 실행할 수 있었습니다. 이 모든 것은 RPC(Remote Procedure Calling)로 축약됩니다. 예에는 CORBA 기술 및 Java - RMI(Remote Method Invoking)가 포함됩니다. 그리고 특히 CORBA에서는 모든 것이 좋은 것 같습니다. 왜냐하면... 어떤 프로그래밍 언어로든 작업할 수 있지만 여전히 부족한 부분이 있습니다. 나는 CORBA의 단점은 모든 방화벽을 통과할 수 있는 단순한 HTTP 대신 자체 네트워크 프로토콜 중 일부를 통해 작동한다는 점이라고 생각합니다. 웹 서비스의 아이디어는 HTTP 패킷에 삽입될 RPC를 만드는 것이었습니다. 그리하여 표준 개발이 시작되었습니다. 이 표준의 기본 개념은 무엇입니까?- 비누 . 원격 프로시저를 호출하기 전에 SOAP 형식의 XML 파일에서 이 호출을 설명해야 합니다. SOAP는 웹 서비스에 사용되는 많은 XML 마크업 중 하나일 뿐입니다. HTTP를 통해 어딘가로 보내려는 모든 것은 먼저 XML SOAP 설명으로 변환된 다음 HTTP 패킷에 담겨 TCP/IP를 통해 네트워크의 다른 컴퓨터로 전송됩니다.
- WSDL . 웹 서비스가 있습니다. 원격으로 메소드를 호출할 수 있는 프로그램입니다. 그러나 표준에 따르면 이 프로그램에는 "예, 맞습니다. 이것은 실제로 웹 서비스이며 여기에서 이러한 메서드를 호출할 수 있습니다."라는 설명이 수반되어야 합니다. 이 설명은 다른 형식의 다른 XML 파일, 즉 WSDL로 표시됩니다. 저것들. WSDL은 웹 서비스를 설명하는 XML 파일일 뿐이며 그 이상은 아닙니다.
일반적인 접근
웹 서비스에는 항상 클라이언트와 서버가 있습니다. 서버는 우리의 웹 서비스이며 때로는 끝점(클라이언트의 SOAP 메시지가 도달하는 끝점)이라고도 합니다. 우리는 다음을 수행해야 합니다:- 웹 서비스의 인터페이스 설명
- 이 인터페이스 구현
- 웹 서비스 시작
- 클라이언트를 작성하고 원하는 웹 서비스 메소드를 원격으로 호출합니다.
main
하고 웹 서비스를 서버로 직접 시작하거나 Tomcat이나 기타 서버에 배포할 수 있습니다. 두 번째 경우, 우리는 새 서버를 시작하지 않고 컴퓨터에서 다른 포트를 열지 않고 단순히 Tomcat 서블릿 컨테이너에 "여기에 웹 서비스 클래스를 작성했습니다. 연락하는 모든 사람이 사용할 수 있도록 게시하십시오"라고 말합니다. 우리의 웹 서비스를 이용하세요." 웹 서비스를 시작하는 방법에 관계없이 동일한 클라이언트를 갖게 됩니다.
섬기는 사람
IDEA를 실행하고 새 프로젝트를 생성해 보겠습니다. Create New Project . HelloWebService 라는 이름을 지정 하고 다음 버튼을 클릭 한 후 마침 버튼을 클릭합니다 . src 폴더 에 ru.javarush.ws 패키지를 생성합니다 . 이 패키지에서는 인터페이스를 생성합니다HelloWebService
.
package ru.javarush.ws;
// это аннотации, т.е. способ отметить наши классы и методы,
// How связанные с веб-сервисной технологией
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
// говорим, что наш интерфейс будет работать How веб-сервис
@WebService
// говорим, что веб-сервис будет использоваться для вызова методов
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWebService {
// говорим, что этот метод можно вызывать удаленно
@WebMethod
public String getHelloString(String name);
}
이 코드에서 클래스는 소위 주석 WebService
이며 WebMethod
인터페이스와 해당 메서드를 웹 서비스로 표시하는 것 외에는 아무 작업도 수행하지 않습니다. 클래스에도 동일하게 적용됩니다 SOAPBinding
. 유일한 차이점은 SOAPBinding
매개변수가 있는 주석이라는 것입니다. 이 경우 style
웹 서비스가 문서 메시지를 통해서가 아니라 클래식 RPC로 작동함을 나타내는 값과 함께 매개변수가 사용됩니다. 메서드를 호출합니다. 인터페이스 로직을 구현하고 패키지에 클래스를 생성해 보겠습니다 HelloWebServiceImpl
. 그건 그렇고, Impl로 클래스를 끝내는 것은 인터페이스 구현이 지정되는 Java의 관례입니다(Impl - 단어 구현, 즉 구현에서 유래). 이는 필수 사항은 아니며 원하는 대로 클래스 이름을 지정할 수 있지만 매너에 따라 다음과 같이 지정해야 합니다.
package ru.javarush.ws;
// таже annotation, что и при описании интерфейса,
import javax.jws.WebService;
// но здесь используется с параметром endpointInterface,
// указывающим полное Name класса интерфейса нашего веб-сервиса
@WebService(endpointInterface = "ru.javarush.ws.HelloWebService")
public class HelloWebServiceImpl implements HelloWebService {
@Override
public String getHelloString(String name) {
// просто возвращаем приветствие
return "Hello, " + name + "!";
}
}
웹 서비스를 독립 서버로 시작하겠습니다. Tomcat 및 애플리케이션 서버의 참여 없이(이는 별도의 논의 주제입니다) 이를 위해 src 폴더의 프로젝트 구조에서 패키지를 생성 하고 그 안에 메소드가 있는 ru.javarush.endpoint
클래스를 생성합니다 . HelloWebServicePublisher
main
package ru.javarush.endpoint;
// класс, для запуска веб-serverа с веб-сервисами
import javax.xml.ws.Endpoint;
// класс нашего веб-сервиса
import ru.javarush.ws.HelloWebServiceImpl;
public class HelloWebServicePublisher {
public static void main(String... args) {
// запускаем веб-server на порту 1986
// и по addressу, указанному в первом аргументе,
// запускаем веб-сервис, передаваемый во втором аргументе
Endpoint.publish("http://localhost:1986/wss/hello", new HelloWebServiceImpl());
}
}
이제 Shift+F10 을 눌러 이 클래스를 실행해 보겠습니다 . 콘솔에는 아무 것도 나타나지 않지만 서버는 실행 중입니다. 브라우저에 http://localhost:1986/wss/hello?wsdl 줄을 입력하여 이를 확인할 수 있습니다 . 열리는 페이지는 한편으로는 컴퓨터(localhost)의 포트 1986에서 실행되는 웹 서버(http://)가 있음을 증명하고, 다른 한편으로는 웹 서비스에 대한 WSDL 설명을 보여줍니다. 애플리케이션을 중지하면 웹 서비스 자체와 마찬가지로 설명을 사용할 수 없게 되므로 이 작업을 수행하지 않고 클라이언트 작성으로 넘어갑니다.
고객
프로젝트 폴더 src 에서 패키지를 생성 하고 그 안에 메소드가 있는ru.javarush.client
클래스를 생성합니다 . HelloWebServiceClient
main
package ru.javarush.client;
// нужно, чтобы получить wsdl описание и через него
// дотянуться до самого веб-сервиса
import java.net.URL;
// такой эксепшн возникнет при работе с an objectом URL
import java.net.MalformedURLException;
// классы, чтобы пропарсить xml-ку c wsdl описанием
// и дотянуться до тега service в нем
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
// интерфейс нашего веб-сервиса (нам больше и нужно)
import ru.javarush.ws.HelloWebService;
public class HelloWebServiceClient {
public static void main(String[] args) throws MalformedURLException {
// создаем ссылку на wsdl описание
URL url = new URL("http://localhost:1986/wss/hello?wsdl");
// Параметры следующего конструктора смотрим в самом первом теге WSDL описания - definitions
// 1-ый аргумент смотрим в атрибуте targetNamespace
// 2-ой аргумент смотрим в атрибуте name
QName qname = new QName("http://ws.javarush.ru/", "HelloWebServiceImplService");
// Теперь мы можем дотянуться до тега service в wsdl описании,
Service service = Service.create(url, qname);
// а далее и до вложенного в него тега port, чтобы
// получить ссылку на удаленный от нас an object веб-сервиса
HelloWebService hello = service.getPort(HelloWebService.class);
// Ура! Теперь можно вызывать удаленный метод
System.out.println(hello.getHelloString("JavaRush"));
}
}
나는 목록의 코드에 대해 최대한의 의견을 제시했습니다. 추가할 내용이 없으므로 실행(Shift+F10)해 봅시다. 콘솔에 텍스트가 표시되어야 합니다. Hello, JavaRush!
표시되지 않았다면 웹 서비스를 시작하는 것을 잊어버린 것일 수 있습니다.
GO TO FULL VERSION