JavaRush /Java Blog /Random-KO /웹 서비스. 1단계. 웹 서비스란 무엇이며 어떻게 사용하나요?
eGarmin
레벨 41

웹 서비스. 1단계. 웹 서비스란 무엇이며 어떻게 사용하나요?

Random-KO 그룹에 게시되었습니다
주제 제목이 정말 질문입니다. 왜냐하면... 나 자신도 그것이 무엇인지 모르고 처음으로 이 기사의 틀 내에서 작업하려고 노력할 것입니다. 제가 보장할 수 있는 유일한 것은 아래에 제시된 코드가 작동할 것이라는 점입니다. 그러나 제 표현은 제가 이 모든 것을 어떻게 이해하는지에 대한 가정과 추측일 뿐입니다. 그럼 가자... 웹 서비스.  1단계. 웹 서비스란 무엇이며 어떻게 사용하나요?  - 1

소개

웹 서비스라는 개념이 탄생한 이유부터 시작해야 합니다. 이 개념이 세상에 등장했을 때, 응용 프로그램이 원격으로 상호 작용할 수 있도록 하는 기술이 이미 존재했습니다. 즉, 한 프로그램이 다른 프로그램의 메서드를 호출하여 다른 도시나 국가에 있는 컴퓨터에서 실행할 수 있었습니다. 이 모든 것은 RPC(Remote Procedure Calling)로 축약됩니다. 예에는 CORBA 기술 및 Java - RMI(Remote Method Invoking)가 포함됩니다. 그리고 특히 CORBA에서는 모든 것이 좋은 것 같습니다. 왜냐하면... 어떤 프로그래밍 언어로든 작업할 수 있지만 여전히 부족한 부분이 있습니다. 나는 CORBA의 단점은 모든 방화벽을 통과할 수 있는 단순한 HTTP 대신 자체 네트워크 프로토콜 중 일부를 통해 작동한다는 점이라고 생각합니다. 웹 서비스의 아이디어는 HTTP 패킷에 삽입될 RPC를 만드는 것이었습니다. 그리하여 표준 개발이 시작되었습니다. 이 표준의 기본 개념은 무엇입니까?
  1. 비누 . 원격 프로시저를 호출하기 전에 SOAP 형식의 XML 파일에서 이 호출을 설명해야 합니다. SOAP는 웹 서비스에 사용되는 많은 XML 마크업 중 하나일 뿐입니다. HTTP를 통해 어딘가로 보내려는 모든 것은 먼저 XML SOAP 설명으로 변환된 다음 HTTP 패킷에 담겨 TCP/IP를 통해 네트워크의 다른 컴퓨터로 전송됩니다.
  2. WSDL . 웹 서비스가 있습니다. 원격으로 메소드를 호출할 수 있는 프로그램입니다. 그러나 표준에 따르면 이 프로그램에는 "예, 맞습니다. 이것은 실제로 웹 서비스이며 여기에서 이러한 메서드를 호출할 수 있습니다."라는 설명이 수반되어야 합니다. 이 설명은 다른 형식의 다른 XML 파일, 즉 WSDL로 표시됩니다. 저것들. WSDL은 웹 서비스를 설명하는 XML 파일일 뿐이며 그 이상은 아닙니다.
왜 그렇게 짧게 물어보나요? 좀 더 구체적으로 말씀해주실 수 없나요? 아마도 가능할 것입니다. 그러나 이를 위해서는 T. Mashnin의 "Java Web Services"와 같은 책을 참조해야 합니다. 처음 200페이지 이상에는 SOAP 및 WSDL 표준의 각 태그에 대한 자세한 설명이 있습니다. 할 가치가 있나요? 제 생각에는 아니거든요. 왜냐면... 이 모든 것은 Java에서 자동으로 생성되며 원격으로 호출되는 메소드의 내용만 작성하면 됩니다. 그래서 JAX-RPC와 같은 API가 Java에 등장했습니다. 모르는 사람이 Java에 이런 API가 있다고 말하면 문제의 기술을 캡슐화하는 클래스 세트가 있는 패키지가 있다는 의미입니다. JAX-RPC는 시간이 지남에 따라 버전별로 발전하여 결국 JAX-WS가 되었습니다. WS는 분명히 WebService의 약자이며 요즘 인기 있는 전문 용어로 RPC의 이름을 바꾼 것일 뿐이라고 생각할 수도 있습니다. 이는 사실이 아닙니다. 왜냐하면 이제 웹 서비스는 원래 아이디어에서 벗어나 원격 메소드를 호출할 수 있을 뿐만 아니라 단순히 SOAP 형식으로 문서 메시지를 보낼 수도 있습니다. 아직 이것이 왜 필요한지는 모르겠지만 여기서는 "필요할 경우를 대비해"라고 답할 가능성은 낮습니다. 나 자신도 경험이 많은 동지들에게서 배우고 싶습니다. 그리고 마지막으로 소위 RESTful 웹 서비스에 대한 JAX-RS가 등장했지만 이는 별도 기사의 주제입니다. 소개는 여기서 끝날 수 있기 때문에... 다음으로 JAX-WS를 사용하여 작업하는 방법을 배웁니다.

일반적인 접근

웹 서비스에는 항상 클라이언트와 서버가 있습니다. 서버는 우리의 웹 서비스이며 때로는 끝점(클라이언트의 SOAP 메시지가 도달하는 끝점)이라고도 합니다. 우리는 다음을 수행해야 합니다:
  1. 웹 서비스의 인터페이스 설명
  2. 이 인터페이스 구현
  3. 웹 서비스 시작
  4. 클라이언트를 작성하고 원하는 웹 서비스 메소드를 원격으로 호출합니다.
다양한 방법으로 웹 서비스를 시작할 수 있습니다. 메서드를 사용하여 클래스를 설명 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클래스를 생성합니다 . HelloWebServicePublishermain
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클래스를 생성합니다 . HelloWebServiceClientmain
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!표시되지 않았다면 웹 서비스를 시작하는 것을 잊어버린 것일 수 있습니다.

결론

이 항목에서는 웹 서비스에 대해 간략하게 살펴보았습니다. 다시 한 번 말씀드리지만, 제가 쓴 내용의 대부분은 그것이 어떻게 작동하는지에 대한 저의 추측이므로 저를 너무 믿으시면 안 됩니다. 지식이 풍부한 사람들이 나를 고쳐주면 감사할 것입니다. 그러면 나는 뭔가를 배울 것이기 때문입니다. UPD. 대화를 계속하자
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION