웹 서비스 란 무엇입니까-WSDL로 설명됩니다. Spring-WS를 사용한 SOAP 웹 서비스

WSDL 1.1이 웹 서비스를 정의하는 방법 및 모델을 만드는 방법 자바 언어 WSDL 문서 확인 및 변환

콘텐츠 시리즈 :

이 기사 시리즈 정보

웹 서비스 - 중요한 기능 엔터프라이즈 컴퓨팅의 Java ™ 기술. 이 기사 시리즈에서는 XML 및 웹 서비스 컨설턴트 인 Denis Sosnovskiy가 웹 서비스를 사용하는 Java 개발자에게 유용한 기본 프레임 워크와 기술에 대해 설명합니다. 시리즈의 기사를 따라이 분야의 최신 개발 사항을 파악하고 자신의 프로젝트에 적용하는 방법을 알아보십시오.

엔터프라이즈 애플리케이션 용 웹 서비스는 서비스 정의 사용에 크게 의존합니다. 서비스 정의는 서비스 제공 업체와 잠재 고객 간의 기본 계약을 설명하며 서비스에서 제공하는 기능 유형과 각 기능 내의 메시지를 자세히 설명합니다. 공급자와 소비자는 보내는 실제 메시지가 서비스 정의와 일치하는 한 교환 개체를 구현하는 방법을 자유롭게 선택할 수 있습니다. 서비스 정의를 사용하여 XML 메시지가 교환되는 방식을 설명하는 것이 웹 서비스를 이전의 분산 프로그래밍 기술과 차별화하는 것입니다.

웹 서비스를 정의하기위한 다양한 방법이 제안되었지만 WSDL 1.1은 여전히 \u200b\u200b가장 널리 사용되는 방법입니다. WSDL 1.1에는 너무 복잡한 구조로 인해 시작되지 않은 사람이 읽기가 어려워지는 등 몇 가지 단점이 있습니다. 또한 권위있는 공식 정의가 부족하여 원본 사양 문서의 일부 공백을 메우는 일관된 "개선"이 발생했습니다. 결과적으로 웹 서비스 스택은 WSDL 1.1 문서를 최대한 유연하게 처리하려고합니다. 이러한 유연성은 WSDL 1.1을 이해하는 데 혼란을 가중시킬 수 있습니다. 개발자는 어떤 접근 방식이 바람직한 지에 대한 표시없이 다양한 WSDL 구조를 볼 수 있기 때문입니다.

이 기사에서는 WSDL 1.1 문서를 구문 분석하는 방법을 보여주고 WSDL 문서를 검증하고이를 표준 양식으로 변환하기위한 Java 모델의 첫 번째 부분을 안내합니다.

WSDL 1.1 구문 분석

사용 된 네임 스페이스

이 기사에서는 다음을 사용합니다.

  • wSDL 1.1 네임 스페이스를 나타내는 wsdl 접두어 http://schemas.xmlsoap.org/wsdl/
  • wSDL 1.1 SOAP 1.1 확장에서 사용하는 http://schemas.xmlsoap.org/wsdl/soap/ 네임 스페이스의 SOAP 접두어
  • xML 스키마 정의에 사용되는 http://www.w3.org/2001/XMLSchema 네임 스페이스의 xs 접두사입니다.

2001 년 초에 발표 된 WSDL 개정 1.1은 2007 년에 발표 된 W3C WSDL 2.0 지침으로 기술적으로 대체되었습니다. WSDL 2.0은 WSDL 1.1보다 더 명확한 구조와 함께 더 많은 유연성을 제공합니다. 그러나 WSDL 2.0은 닭과 계란 문제를 안고 있습니다. WSDL 2.0은 널리 지원되지 않기 때문에 널리 사용되지 않으며 널리 사용되지 않기 때문에 웹 서비스 스택 개발자가이를 지원할 인센티브가 거의 없습니다. 모든 결함에도 불구하고 WSDL 1.1은 대부분의 목적에 충분합니다.

원래의 WSDL 1.1 사양은 사용 된 기능 수 측면에서 정확하지 않았습니다. WSDL의 초점은 SOAP 서비스 정의에 있었기 때문에 나중에 더 이상 사용되지 않는 SOAP 기능 (예 : rpc 인코딩)에 대한 지원도 포함되었습니다. WS-I (Web Services Interoperability Organization)는 SOAP 및 WSDL을 사용하는 웹 서비스에 대한 모범 사례를 제공하는 BP (Baseline Profile)에서 이러한 문제를 해결했습니다. BP 1.0은 2004 년에 승인되었고 BP 1.1은 2006 년에 출시되었습니다. 이 기사는 WS-I BP 지침에 기반한 WSDL 1.1에 초점을 맞추고 SOAP 용 rpc 인코딩과 같은 사실상의 레거시 기능을 다루지 않습니다.

XML 문서의 구조는 XML 스키마 정의에 의해 정의 된 것으로 가정합니다. 원래 WSDL 1.1 사양에는 스키마 설명이 포함되어 있지만 스키마는 여러 측면에서 텍스트 설명과 일치하지 않습니다. 이는 나중에 수정 된 스키마 버전에서 수정되었지만 WSDL 1.1 문서는이 변경 사항을 반영하도록 편집되지 않았습니다. 그런 다음 BP WS-I 팀은 WSDL 스키마를 더 많이 변경하기로 결정하고이 미끄러운 스키마에 대한 모범 사례 가이드로 환영받는 것을 만들었습니다. 한 버전의 스키마에 대해 작성된 문서는 일반적으로 다른 버전과 호환되지 않지만 (동일한 네임 스페이스를 사용하더라도) 다행스럽게도 대부분의 웹 서비스 도구는 기본적으로 스키마를 무시하고 합리적으로 보이는 모든 것을 허용합니다. (섹션에서 많은 WSDL 스키마에 대한 링크를 참조하십시오).

WSDL 1.1 스키마의 WS-I BP 버전조차도 WSDL 1.1 문서 사양을 준수하는 데 도움이되지 않습니다. 다이어그램은 특히 구성 요소 순서와 관련하여 BP WS-I의 모든 제한 사항을 반영하지 않습니다. 또한 XML 스키마는 문서에서 쉽게 설정되는 여러 유형의 제약 조건 (예 : 대체 속성 또는 별도의 스키마에서 필요한 추가 요소)을 처리 할 수 \u200b\u200b없습니다. 따라서 WSDL 1.1 사양 (BP WS-I에 의해 수정 됨)에 대해 WSDL 1.1 문서의 유효성을 검사하는 것은 단순히 XML 스키마 유효성 검사를 수행하는 것 이상을 포함합니다. 이 기사에서이 주제로 돌아올 것입니다. 하지만 먼저 WSDL 1.1 서비스 설명의 구조를 살펴 보겠습니다.

설명 구성 요소

WSDL 1.1 문서는 편리한 이름으로 고정 된 루트 요소를 사용합니다. ... WSDL 1.1 네임 스페이스의이 루트 요소 내에 하나의 "수동"하위 요소 (개별 WSDL 1.1 문서에 대한 링크)와 5 개의 "활성"하위 요소 (실제로 서비스 설명을 구성 함)가 정의됩니다.

  • 이 문서에 포함될 설명이있는 별도의 WSDL 1.1 문서를 나타냅니다.
  • 메시징에 사용되는 XML 유형 또는 요소를 정의합니다.
  • 유형 측면에서 실제 메시지를 정의하거나 xML 요소;
  • 서비스에 의해 수행되는 추상적 인 작업 집합을 정의합니다.
  • 실제 구현을 정의 특정 프로토콜 및 형식 사용
  • 일반적으로 하나 이상의 요소를 포함하여 서비스 전체를 정의합니다. 요소에 대한 액세스 정보 포함 .

요소도 있습니다 첫 번째 자녀로서 문서화 목적으로 사용할 수 있습니다. 위의 첫 번째 자식도 마찬가지입니다.

서비스에 대한 완전한 설명에는 일반적으로 이러한 유형 각각에 대해 하나 이상의 요소가 필요합니다. ,하지만 모두 같은 문서에있을 필요는 없습니다. 여러 문서에서 완전한 WSDL 설명을 작성하려면 다음을 사용할 수 있습니다. , 조직의 필요에 따라 설명을 세분화 할 수 있습니다. 예를 들어 처음 세 개의 설명 요소 ( , ) 함께 만들다 전체 설명 서비스 인터페이스 (아키텍처 그룹에 의해 정의 될 수 있음)이므로 구현 지향 요소와 별도로 유지하는 것이 좋습니다. ... 모든 주요 웹 서비스 스택은 설명을 여러 WSDL 문서로 분할하는 것을 지원합니다.

목록 1은 두 개의 WSDL 문서로 분할 된 WSDL 서비스 설명의 예를 보여줍니다. 따라서 인터페이스 설명 컴포넌트는 BookServerInterface.wsdl 파일에 있고 구현 컴포넌트는 BookServerImpl.wsdl 파일에 있습니다. 목록 1은 BookServerInterface.wsdl을 보여줍니다.

목록 1. BookServerInterface.wsdl
책 서비스 인터페이스 정의. ... ... 도서 서비스 구현. 이것은 클래스가로드 될 때 책의 초기 라이브러리를 만든 다음 라이브러리 정보에 액세스하기위한 메서드 호출을 지원합니다 (새 책 추가 포함). 특정 ISBN으로 책을 가져옵니다. ... 새 책을 추가하십시오.

목록 2는 BookServerImpl.wsdl을 보여줍니다. 요소 먼저 BookServerInterface.wsdl 인터페이스의 설명을 가져옵니다.

목록 2. BookServerImpl.wsdl
실제 도서 서비스 구현의 정의. ...

WSDL 1.1 네임 스페이스의 요소 (및 속성) 정의 외에도 WSDL 1.1은 추가 요소도 정의합니다. 특정 유형의 서비스에 필요한 추가 정보를 전달하기 위해 WSDL 1.1 서비스 설명의 특정 셀을 채우기위한 것입니다. 여전히 널리 사용되는 유일한 추가 WSDL 1.1 요소는 SOAP 1.1에 대한 바인딩입니다 (이러한 요소는 )는 원래 WSDL 1.1 사양에 정의되었으며 SOAP 1.2의 경우 2006 년에 별도의 사양에 정의되었습니다.

구성 요소 세부 정보

요소 메시지에 사용되는 모든 XML 정의를 하나 이상의 요소로 포함 ... (WSDL은 이러한 정의에 대해 XML 스키마의 대안을 허용하지만 대부분의 스택은 XML 스키마 만 지원합니다.) 필요한 경우 요소 사용할 수 있습니다 또는 WSDL 외부에있는 다른 스키마를 포함합니다 (동일한 WSDL 내의 별도 스키마 참조).

하나의 요소부터 임의의 수의 스키마 정의를 포함 할 수 있으며 WSDL 문서에서 둘 이상의 요소를 사용할 이유가 없습니다. ... 요소로 BookServerInterface.wsdl의 맨 위에 있습니다.

게다가 , WSDL 문서의 모든 최상위 구성 요소에는 필수 이름 속성을 사용하여 별도의 이름이 할당됩니다. 루트 요소에서 targetNamespace 속성을 사용하는 경우 문서 (일반적으로 가장 좋음)에서 이러한 구성 요소의 이름은 해당 대상 네임 스페이스에 정의됩니다. 즉, 이름을 정의 할 때 이름의 단순 또는 "로컬"부분을 할당하는 것으로 충분하지만 해당 구성 요소에 대한 참조는 네임 스페이스 접두사 또는 기본 네임 스페이스로 이름을 한정해야합니다. 그림 1은 WSDL 구성 요소 간의 가장 중요한 관계를 보여줍니다. 실선은 전체 이름으로 링크를 나타내고 파선은 네임 스페이스를 한정하지 않고 식별하는 데 사용됩니다.

그림 1. WSDL 구성 요소 간의 관계

요소로 표시되는 메시지 WSDL 서비스 설명의 핵심에 있습니다. 요소 고객과 서비스 제공 업체간에 전송되는 XML 데이터에 대한 설명입니다. 각 요소 0 개 이상의 (일반적으로 1 개) 자식 포함 ... 각 부품 요소에는 고유 한 이름 속성 ( ) 및 XML 데이터 스키마 정의를 참조하는 요소 또는 유형 속성 중 하나. 여러 항목 항목 뒤에 표시 BookServerInterface.wsdl에서.

요소 서비스와주고받는 메시지의 관점에서 서비스의 추상 인터페이스를 정의합니다. 요소 임의의 수의 자식 포함 ... 각 어린이 고유 한 이름 속성이 필요합니다 (BP WS-I에서는 )이며 작업에 사용되는 메시지를 설명하는 하나 이상의 자식 요소가 포함됩니다. 하위 요소는 용도에 따라 세 가지 유형이 있습니다.

  • : 작업에 대한 입력으로 고객이 서비스 제공자에게 보낸 데이터;
  • : 작업의 결과로 서비스 제공자가 고객에게 반환 한 데이터;
  • : 처리 중 오류 발생시 서비스 제공자가 고객에게 반환하는 데이터.

WSDL 1.1은 서로 다른 하위 시퀀스로 표현되는 고객과 서비스 공급자 간의 여러 상호 작용 패턴을 정의합니다. 그러나 모든 모델이 구현하기에 충분히 잘 정의 된 것은 아닙니다. BP WS-I는 요청-응답 작업의 두 가지 모델 만 허용합니다. 할까요 및 다음 만 포함하는 단방향 작업 ... 요소 뒤에 요청-응답 유형 (지금까지 가장 일반적인 유형)의 작업의 경우 여러 요소가 뒤따를 수 있습니다. .

각 요소 , 또는 필수 메시지 속성을 통해 메시지에 대한 설명을 참조합니다. 이것은 네임 스페이스 한정 참조이므로 일반적으로 접두사를 추가해야합니다. 예는 다음에서 볼 수 있습니다. getBook 작업 설명에 사용됩니다. (tns 접두사는 루트 요소의 정의로 사용됩니다. targetNamespace 속성과 동일한 URI 네임 스페이스를 사용합니다.)

여러면에서 Java 인터페이스의 논리적 등가물로 생각할 수 있으므로 요소는 메소드, 요소와 동일합니다. -메소드 매개 변수, 요소 -방법의 결과 및 요소 -확인 된 예외. 이러한 매핑은 기존 Java 코드에서 WSDL을 생성하는 대부분의 도구와 마찬가지로 WSDL에서 Java 코드를 생성 할 때 사용됩니다.

SOAP 1.1과 1.2 비교

SOAP 1.1은 2000 년에 규격이 발표 된 이후로 웹 서비스에 널리 사용되었습니다. SOAP 1.2는 W3C를 통해 더 광범위한 산업 지원으로 개발되었으며 2007 년에 공식 W3C 표준으로 게시되었습니다. SOAP 1.2는 SOAP 1.1보다 더 잘 문서화되고 깔끔하며 1.1의 추악한 측면 중 일부는 외과 적으로 제거되었습니다. 이러한 정교한 구조에도 불구하고 대부분의 웹 서비스에서 둘 사이에는 실질적인 차이가 거의 없습니다. 아마도 SOAP 1.2의 가장 중요한 기능은 XML XOP (Binary Optimized Packaging) 및 SOAP MTOM (Message Transmission Optimization Mechanism)에 대한 확장 된 SOAP 첨부 지원을 활용하기 위해 공식적으로 지원되는 유일한 방법이라는 것입니다. 루프에서 자바 웹 서비스 이전 스택 중 일부는 SOAP 1.2를 지원하지 않기 때문에 지금까지 SOAP 1.1을 사용했지만 새로운 웹 서비스 1.2를 개발하려면 아마도 최선의 선택 일 것입니다.

요소 정의 된 추상 인터페이스의 인스턴스를 나타냅니다. BookServerImpl.wsdl의 시작 부분에 표시됩니다. type 속성은 바인딩에 구현 된 포트 유형의 완전한 이름을 포함합니다.

자식 요소 포트 유형을 구현하는 방법에 대한 세부 정보를 포함합니다. WSDL 네임 스페이스의 하위 요소는 요소에 해당합니다. 동일한 이름 값을 사용해야합니다. 하지만 사례에서와 같이 정제 된 참조 ... 이 관계는 레벨에서 점선으로 표시됩니다. ... 이름에 의한 동일한 관계가 어린이에게도 적용됩니다 / / 집단 ... 동일한 요소 이름의 재사용에도 불구하고 이러한 요소의 내용은 하위 요소 일 때 크게 다릅니다. , 요소가 아님 .

WSDL 정의 확장이 작동합니다. ... 하위 요소 SOAP 서비스 정의에서 사용됩니다 (WSDL 1.1에서도 HTTP 바인딩을 허용하지만 WS-I BP에서 허용하는 유일한 서비스 유형). 이 아이템 바인딩에 사용되는 전송 모드를 정의하기 위해 필수 전송 속성을 사용합니다. (http://schemas.xmlsoap.org/soap/http의 값에서 볼 수 있듯이 HTTP는 WS-I VR에서 허용되는 유일한 선택입니다.) 선택적 스타일 속성을 사용하면 rpc와 문서 중에서 선택할 수 있습니다. XML 데이터를 나타내는 스타일 (문서의 가장 일반적인 값은 유형이 아닌 스키마 정의 요소를 사용하는 메시지와 일치 함)

각 하위 요소 내부 요소 요소 이 작업을 호출하는 요청을 식별하기 위해 SOAPAction 값을 지정하는 데 사용할 수 있습니다 (그리고 잠재적으로 , BP WS-I는 그러한 사용을 금지하지만). 각 어린이 / / 항상 요소 인 다른 선택적 요소를 포함합니다. (메시지 데이터가 SOAP 메시지 본문에 전달됨을 나타냄-데이터 및 오류조차도 SOAP 헤더에 전달할 수 있지만 권장하지는 않습니다.) 또는 또는 이에 상응하는 함께 사용 .

WSDL 서비스 설명의 마지막 구성 요소는 요소입니다. 요소 그룹으로 구성 ... 각 요소 액세스 주소를 ... 액세스 주소는 중첩 된 선택적 요소에 포함됩니다. .

WSDL 작업

당연히 WSDL 1.1 문서에 대한 모든 스키마 및 규칙 변형으로 인해 많은 문서가 BP WS-I 모범 사례를 따르지 않습니다. 많은 모범 사례 편차의 모든 웹 서비스 스택에 의한 지원은 오래되거나 잘못 구성된 구조의 사용을 영속화하여 업계 전체에 나쁜 사례가 확산되도록했습니다. 그리고 저는 확실히이 감염에 면역이되지 않습니다.이 시리즈의 코드 예제로 제공 한 WSDL 문서를 살펴보면, 그 어느 것도 완전히 정확하지 않다는 사실에 놀랐습니다.

따라서이 기사를 작성하기로 결정했을 때 WSDL 문서의 우수 사례를 검증 할 수있는 도구를 포함하는 것이 좋을 것이라고 생각했습니다. 원본 WSDL에 오류가없는 경우 WSDL 문서를 올바른 형식으로 변환하는 것에서 한 단계 밖에 남지 않은 것 같습니다. 그러나 작업은 원래 계획했던 것보다 훨씬 더 많은 것으로 밝혀졌으며이 시리즈의 다음 두 기사에서이 모델에 대한 전체 정보를 포함 할 것입니다.

Java 언어로 된 WSDL 문서로 작업하려면 다른 모델, JSR 110 참조 구현 인 WSDL4J (Java Toolkit 용 웹 서비스 기술 언어)를 포함합니다 (섹션 참조). 이러한 모델 중 어느 것도 문제의 두 가지 설정으로 인해 내가하려는 작업과 일치하지 않습니다. 첫째, 반 지능적인 형식으로 WSDL 문서를 읽고 모범 사례에서 오류 및 편차를보고하고 둘째로 오류없는 WSDL을 작성하는 것입니다. 실제 권장 사항을 준수하는 형식으로 재 포맷 된 문서. 예를 들어 WSDL4J는 정렬 문제를보고 할 수 있도록 입력 요소의 순서를 유지하지 않으며 스키마 정의를 처리하지 않으므로 요소에서 참조를 확인하는 데 직접 사용할 수 없습니다. ... 그래서 좀 더 현실적인 문제 설정과 나만의 모델 작성 중 하나를 선택해야했습니다. 당연히 나만의 모델을 쓰기로 결정했습니다.

WSDL 모델

검증 및 검증

이 기사에서는 확인 WSDL 문서의 유효성 검사를 나타냅니다. 대체 용어는 다음과 같습니다. 확인일반적으로 XML 문서에 사용되는은 스키마 정의에 대해 문서 유효성 검사를 의미합니다.

이전에 JiBX / WS 프로젝트의 일부로 JiBX 데이터 바인딩과 함께 사용하기 위해 WSDL 모델을 부분적으로 구현했습니다. 이 모델은 출력 전용이며 경우에 따라 중첩 된 WSDL XML 구조 요소의 데이터를 결합하는 비교적 적은 수의 클래스를 포함합니다 ( 한 아이와 결합 , , 내부 요소와 결합 또는 기타.). 이 컴팩트 한 클래스 구조로 인해 프레임 워크에서 지원하는 WSDL 문서의 하위 집합을 쉽게 빌드 할 수 있었지만이 모델을 기반으로 검증 및 구조 조정 도구를 구축하는 것을 고려하기 시작했을 때 모델이 구조화되지 않았을 가능성이있는 입력을 지원한다는 것을 깨달았습니다. WSDL은 XML 표현에 더 가까워 야합니다.

또 다른 옵션은 WSDL 1.1 용 WS-I BP 스키마에서 코드를 생성하는 것입니다. 이를보고 생성 된 클래스를 사용하는 것만으로도 혼동이 발생할 수 있다는 것을 깨달았습니다. 스키마에는 다양한 메시징 모델을 나타내는 데 사용되는 어색한 구성과 중복 유형이 포함되어 있기 때문입니다 (일부는 WS-I BP에서 허용하지 않음). 텍스트) ...

그래서 결과는 스키마에서 생성 된 코드로 시작하고 불필요한 중복과 복잡성을 줄인 것처럼 결과가 거의 동일했지만 손으로 \u200b\u200b클래스를 작성했습니다. JiBX 데이터 바인딩은 동일한 클래스에 대한 여러 바인딩을 유지하므로 WSDL 출력에 대한 출력 바인딩을 구성하는 것이 모범 사례에 불과했지만 WSDL 1.1의 모든 버전에서 허용하는 모든 옵션을 처리하는 입력 바인딩을 만들 수있었습니다. 형태.

목록 3은 루트 요소에 해당하는 Definitions 클래스 부분을 보여줍니다. .

Listing 3. Definitions 클래스 (부분적으로)
public class Definitions extends ElementBase (/ ** 예상 된 순서대로 자식 요소를 나열합니다. * / static enum AddState (잘못된, 가져 오기, 유형, 메시지, portType, 바인딩, 서비스); / ** 허용 된 속성 이름 목록 * / public static final StringArray s_allowedAttributes \u003d new StringArray (new String ( "name", "targetNamespace")); / ** 사용 된 컨텍스트의 유효성을 검사합니다. * / Private ValidationContext m_validationContext; / ** 현재 상태 (* / / ** 자식이 추가되는 순서를 확인하는 데 사용됨). * / 개인 AddState m_state; / **이 정의의 이름. * / 개인 문자열 m_name; / ** 대상 네임 스페이스 WSDL. * / 개인 문자열 m_targetNamespace; / ** 모든 수입 된 하위 목록. * / 개인 목록 m_imports \u003d 새 ArrayList (); / ** 모든 유형의 어린이 목록. * / 개인 목록 m_types \u003d 새 ArrayList (); / ** 하위 요소의 모든 메시지 목록. * / 개인 목록 m_messages \u003d 새 ArrayList (); / ** 모든 하위 portType 요소 목록. * / 개인 목록 M_portTypes \u003d 새 ArrayList (); / ** 모든 자식 바인딩 목록. * / 개인 목록 m_bindings \u003d 새 ArrayList (); / ** 모든 아동 서비스 목록. * / 개인 목록 m_services \u003d 새 ArrayList m_nameMessageMap \u003d 새 HashMap (); / **이 정의에서 정규화 된 이름을 포트 유형에 매핑합니다. * / 개인지도 m_namePortTypeMap \u003d 새 HashMap (); / **이 정의에서 정규화 된 이름을 메시지에 매핑합니다. * / 개인지도 m_nameBindingMap \u003d 새 HashMap (); / **이 정의에서 정규화 된 이름을 서비스에 매핑합니다. * / 개인지도 m_nameServiceMap \u003d 새 HashMap (); ... / ** * 전환 상태 확인 다른 유형 자식 요소. * 항목이 예상 순서가 아닌 경우 * 예상 순서 중 첫 번째 항목이 보고서에 표시됩니다. * @param state new add state * @param comp element component * / private void checkAdd (AddState state, ElementBase comp) (if (m_state! \u003d state) (if (m_state \u003d\u003d null || (m_state! \u003d AddState.invalid && state.ordinal ()\u003e m_state.ordinal ())) (// 다른 유형의 자식 요소로 전환 m_state \u003d state;) else if (state.ordinal ()< m_state.ordinal()) { // отчет о дочерних элементах вне ожидаемого порядка m_validationContext.addWarning ("Child element of wsdl:definitions out of order", comp); m_state = AddState.invalid; } } } ... /** * Добавление немаршаллизированного дочернего элемента wsdl:message. * Здесь же сообщение индексируется по имени для доступа с целью валидации. * * @param child */ public void addMessage(Message child) { checkAdd(AddState.message, child); m_messages.add(child); addName(child.getName(), child, m_nameMessageMap); } ...

의 하위 데이터 구성은 모델이 다음에 따라 일반 입력과 출력을 모두 지원하는 방법을 보여줍니다. 실용적인 권장 사항... 모든 유형의 단일 하위 목록 대신 각 유형에 대해 별도의 목록이 사용됩니다. JiBX 입력 바인딩은 자식을 순서가 지정되지 않은 집합으로 취급하여 이 유형의 자식이 제자리를 벗어날 때마다 요소의 set-method. 위의 값을 바꾸는 대신 setter는 자식 요소에 사용되는 addMessage () setter에서 볼 수 있듯이 유형이 지정된 목록에 인스턴스를 추가합니다. ... 각 setter는 또한 비 순차 항목을 포착하기 위해 상태 검사를 실행합니다.

추가 속성 및 요소는 모든 WSDL 요소 (일반적으로 WSDL 1.1 네임 스페이스를 사용하지 않는 모든 속성 또는 요소)에서 허용됩니다. 이러한 추가 요소의 예는이 시리즈의 이전 기사에서 WSDL 문서에 포함 된 WS-Policy 구성과 실제 정책에 대한 링크입니다. 이러한 추가 요소가 WSDL 1.1 네임 스페이스의 자식 요소 앞에 오는 것이 가장 좋으며, 이것이 출력 바인딩에서 처리되는 방법입니다. 입력 바인딩은에 표시되지 않은 WSDL 요소 클래스의 기본 클래스 코드를 사용하여 추가 요소 및 속성을 처리하고 요소가 순서에 관계없이 따라 올 수 있도록합니다 (WSDL 1.1 네임 스페이스의 요소를 따르는 경우 경고 생성).

모델은 각각 고유 한 클래스 집합이있는 각 추가 네임 스페이스에 대해 별도의 바인딩을 사용하여 알려진 요소를 처리합니다. 다음 릴리스에서 이러한 추가 요소 처리에 대해 자세히 설명하겠습니다. 자바 웹 서비스, 소스 코드가 더 자세히 표시됩니다.

모델 검증

WSDL 데이터의 일부 기본 검증은 끝에있는 addMessage () 코드에 표시된 것처럼 요소에 해당하는 비 정렬 화 개체가 WSDL 문서의 트리 구조에 추가되므로 수행됩니다. 이 코드는 checkAdd () 메서드를 사용하여 자식의 순서를 확인하고 addName () 메서드를 사용하여 유효한 이름이 제공되었는지 (텍스트가 스키마 유형 NCName과 일치하고 값이 요소 유형 내에서 고유함) 및 매핑을 확인합니다. 객체에 대한 이름. 그러나 이것은 개별 요소에 대한 가장 기본적인 정보의 확인 일뿐입니다. 각 항목의 다른 속성과 항목 간의 관계를 확인하려면 추가 확인 코드가 필요합니다.

JiBX를 사용하면 마샬링 및 언 마샬링 프로세스의 일부로 사용자 지정 확장 처리기를 호출 할 수 있습니다. WSDL 모델은 이러한 추가 핸들러 중 하나 인 post-set 메소드를 사용하여 검증 로직을 실행합니다. post-set 메서드는 관련 개체의 비 정렬 화가 완료된 후에 호출되므로 개체에 대한 형식 검사를 수행하는 좋은 방법입니다. WSDL 유효성 검사의 경우 가장 간단한 방법은 루트 요소에 대해 하나의 사후 설정 방법에서 모든 개체를 확인하는 것입니다. ... 이 접근 방식은 컴포넌트가 예상 된 순서가 아닐 때 WSDL 문서의 컴포넌트를 직접 참조하는 문제를 방지합니다.

기타 추가 사항

이 기사에서는 WSDL의 구조 및 사용에 대한 기본 사항과 WSDL 문서의 검증을 지원하고이를 모범 사례 양식으로 변환하기위한 WSDL 용 Java 데이터 모델에 대한 소개를 설명합니다.

다음 기사에서는 WS-Policy 및 WS-SecurityPolicy 어설 션을 작성할 때 일반적인 문제를 살펴보면서이 주제를 계속 진행합니다. 또한 WSDL에 포함 된 WS-Policy / WS-SecurityPolicy 어설 션을 포함하도록 모델을 확장하는 것을 포함하여 WSDL 모델 및 확인 프로세스에 대해 자세히 설명합니다.

일단 그들이 나에게 웹 서비스 개발을 시작하는 임무를 주었고 설명없이 가장 간단한 프로젝트의 샘플을주었습니다. 물론 프로젝트는 시작되지 않았습니다. Spring이란 무엇이며 어떻게 작동하는지 전혀 몰랐습니다. 또한 러시아어 나 영어로 된 Spring을 사용한 웹 서비스 개발에 대한 적절한 기사를 찾을 수 없었습니다. 나는 그것을 스스로 알아 내야 만했고 그렇게 무섭지 않은 것으로 판명되었다.
그리고 최근에 저는 그 이후로 Spring에 어떤 새로운 기능이 추가되었는지 확인하고 이전 서비스를 업데이트하기로 결정했습니다. 그 결과이 기사를 작성하게되었습니다.

이 글은 Spring-WS를 사용하여 기본적인 SOAP 기반 웹 서비스를 개발하기위한 가이드입니다.

그래서 우리는 사용자 이름을 받아들이고 인사말과 서버의 현재 시간을 보내는 간단한 서비스를 작성합니다.

우리는 무엇이 필요한가?
  • IDE. Eclipse를 사용하고 있습니다.
일을위한 준비
새 웹 응용 프로그램 프로젝트를 만듭니다. Eclipse에서 이것은 "File \u003d\u003e New \u003d\u003e Dynamic Web Project"입니다.
프로젝트 이름은 HelloService입니다.
다음으로 Spring, XMLBean, wsdl4j, commons-logging에서 프로젝트 디렉토리 WEB-INF / lib로 라이브러리를 복사하십시오.
원하는 경우 서버 라이브러리에 추가하여 모든 응용 프로그램에서 드래그하지 않도록 할 수 있습니다.
WSDL 스키마 생성
기본적으로 WSDL 스키마는 서비스를 설명하기위한 것입니다.
물론 수동으로 생성하지는 않습니다. 스키마는 Spring 도구에 의해 자동으로 생성되지만 나중에 더 자세히 설명합니다.
입력 및 출력 데이터 정의
입력 데이터:
  • 문자열 이름.
산출:
  • 문자열 인사말;
  • 시간은 현재 시간입니다.
입력 및 출력 데이터에 대한 설명 작성
WEB-INF 디렉토리에서 HelloService.xsd 파일을 만듭니다. 이 파일은 WSDL 스키마를 생성하고 해당 Java 클래스를 생성하는 데 필요합니다.
파일 텍스트 :

속성 targetNamespace -사용 된 네임 스페이스. 그. 생성 된 모든 객체는 org.example.helloService 패키지에 있습니다.
요소 서비스 요청ServiceResponse 입력 및 출력 데이터 (요청 / 응답)를 각각 설명합니다.
속성 minOccursmaxOccurs 한 요소 내에서 주어진 구성 요소의 반복 횟수를 결정합니다. 이 매개 변수를 지정하지 않으면 기본적으로 1로 간주됩니다. 선택적 구성 요소의 경우 minOccurs \u003d 0을 지정해야합니다. 구성 요소 수에 제한 없음 : maxOccurs \u003d 제한 없음.
XML 스키마에 대해 자세히 읽을 수 있습니다.
자바빈 생성
생성 된 스키마를 기반으로 Java 클래스를 생성합니다. 이렇게하려면 build.xml 파일을 만듭니다.

매개 변수 WS_HOME XMLBeans가있는 디렉토리를 가리켜 야합니다.
HelloService.xsd -생성 된 구성표의 경로.
lib \\ helloservice.jar -생성되는 자바 라이브러리.

다음으로 Ant-build를 실행합니다 (이미 설치했으면합니다).
Eclipse에서 다음과 같이 실행할 수 있습니다. build.xml 파일에서 RMB \u003d\u003e Run As \u003d\u003e Ant Build.
명령 줄을 통해 :
ant -buildfile build.xml
글쎄, 우리는 건설 완료를 기다리고 있습니다. 그 후 프로젝트 디렉토리 WEB-INF \\ lib에서 해당 라이브러리 (helloservice.jar)가 있는지 확인할 수 있습니다.

서비스 구현
인터페이스 및 서비스 클래스 생성
서비스 인터페이스 : HelloService.java :
패키지 org.example; import java.util.Calendar; 공용 인터페이스 HelloService (공용 문자열 getHello (문자열 이름)에서 예외 발생, 공용 달력 getCurrentTime ();)
서비스 구현 : HelloServiceImpl.java :
패키지 org.example; import java.util.Calendar; import org.springframework.stereotype.Service; @Service 공용 클래스 HelloServiceImpl은 HelloService를 구현합니다 (공용 문자열 getHello (문자열 이름)에서 예외 발생 ( "Hello"+ name + "!";)) 공용 달력 getCurrentTime () (Calendar.getInstance ();) 반환)
이 코드는 주석이 필요하지 않다고 생각합니다. 이전에 Spring을 접하지 않은 사람들이 질문을 제기 할 수있는 유일한 것은 @ Service 어노테이션이지만 이에 대해서는 잠시 후에 이야기하겠습니다.
끝점
엔드 포인트는 들어오는 요청 (일종의 진입 점)을 처리하는 클래스입니다.

HelloServiceEndpoint.java 파일을 만듭니다.
패키지 org.example; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ws.server.endpoint.annotation.Endpoint; import org.springframework.ws.server.endpoint.annotation.PayloadRoot; import org.example.helloService.ServiceRequestDocument; import org.example.helloService.ServiceRequestDocument.ServiceRequest; import org.example.helloService.ServiceResponseDocument; import org.example.helloService.ServiceResponseDocument.ServiceResponse; @Endpoint 공용 클래스 HelloServiceEndpoint (개인 정적 최종 String namespaceUri \u003d "http://www.example.org/HelloService", 개인 HelloService helloService, @Autowired public void HelloService (HelloService helloService) (this.helloService \u003d helloService;) (@PayloadRoot localPart \u003d "ServiceRequest", namespace \u003d namespaceUri) public ServiceResponseDocument getService (ServiceRequestDocument 요청)에서 예외 발생 (ServiceRequestDocument reqDoc \u003d request; ServiceRequest req \u003d reqDoc.getServiceRequest (); ServiceResponseDocument \u003d respaDoc \u003d ServiceResponseDocument addNewServiceResponse (); 문자열 userName \u003d req.getName ( ); 문자열 helloMessage \u003d testNewService.getHello (userName); Calendar currentTime \u003d testNewService.getCurrentTime (); resp.setHello (helloMessage); resp.setCurrent); returnTime (currentTime)
여기서 무슨 일이 있었습니까?
주석 @ 엔드 포인트 그냥 결정 이 수업 들어오는 요청을 처리합니다.
namespaceUri -xml 스키마를 만들 때 지정한 것과 동일한 네임 스페이스

이제 조금 뒤로 돌아가서 주석을 기억해 보겠습니다. @ 서비스... 독자에게 불필요한 정보를 과부하시키지 않도록 세부 사항에 들어 가지 않으면이 주석은 Spring에 "적절한 객체를 생성하도록 지시합니다. 그리고 주석 @Autowired 해당 개체의 주입 (자동 대체) 역할을합니다. 물론 구축 할 때 간단한 응용 이러한 주석을 사용하는 것은 의미가 없지만이 예제에서는 모두 제외하지 않기로 결정했습니다.

그렇지 않으면 다시 모든 것이 명확해야합니다. ServiceRequest, ServiceResponse 등이 있습니다. -이들은 xml-schema를 기반으로 생성 된 클래스입니다.

Spring 서비스 구성
그래서 이미 끝이 다가오고 있습니다.
service-ws-servlet.xml 파일을 만듭니다.

sws : 주석 기반 -이 프로젝트에서 주석이 사용된다는 것을 정확히 나타냅니다.
컨텍스트 : 구성 요소 스캔 주석을 검색 할 패키지를 나타내며 하위 패키지에서도 검색합니다.

다음 두 개의 빈은 항상 변경되지 않습니다. 그들의 본질은 Xml에서 요청을 받아 Java 객체로 변환 한 다음 변환을 되 돌리는 것입니다.

sws : dynamic-wsdl 생성 된 Xml 스키마를 기반으로 WSDL 문서의 자동 생성을 담당합니다.
위치 스키마에 대한 경로를 나타냅니다.
locationUri -WSDL 체계를 사용할 수있는 주소 (컨테이너에 상대적)
필자의 경우 WSDL은 다음 주소에서 사용할 수 있습니다.
localhost / HelloService / HelloService.wsdl

배포 설명자
그리고 마지막으로.
WEB-INF 디렉토리에서 web.xml 파일을 수정하거나 생성합니다.
HelloService HelloService 서비스 -ws org.springframework.ws.transport.http.MessageDispatcherServlet transformWsdlLocations 진실 서비스 -ws /*
이 파일을 더 이상 설명하지 않겠습니다. 대부분은 이미 알고 있어야합니다. 복잡하지 않은 프로젝트의 경우 본질적으로 변경되지 않아야합니다. 서블릿 이름 (servlet-name)이 서비스의 Spring 구성 파일 이름과 일치해야한다는 점만 주목할 가치가 있습니다. 서비스 -ws-servlet.xml.
기능 점검
올바른 작업의 첫 번째 징후는 생성 된 WSDL 스키마입니다.
확인하려면이 스키마의 주소 (http : //localhost/HelloService/HelloService.wsdl)로 이동하여 xml 파일이 표시되어야합니다. 아무것도 표시되지 않거나 어떤 오류가 나타나면 전체 기사를주의 깊게 다시 읽고 잘못한 부분을 찾습니다.

추가 확인을 위해 soapUI가 필요합니다 (버전 3.0.1 있음).
설치하고 실행하십시오.
새 프로젝트 만들기 : File \u003d\u003e New soapUI Project. 초기 WSDL / WADL 필드에 WSDL 스키마 (http : //localhost/HelloService/HelloService.wsdl)에 대한 링크를 삽입하십시오.
생성 된 프로젝트에서 필요한 요청을 엽니 다.

이름 필드에 이름을 입력하고 "요청 보내기"버튼을 클릭합니다.


결과적으로 서버로부터 인사말과 현재 시간이 포함 된 응답을받습니다.


문제가 발생하면이 기사를 다시 읽습니다.

무엇 향후 계획?
다음 단계는이 웹 서비스에 대한 클라이언트를 작성하는 것입니다. 그러나 이것은 이미 다른 기사의 자료이며이 자료가 누군가에게 관심이 있다면 나중에 작성 될 것입니다.

주제 제목은 정말 질문입니다. 나는 그것이 무엇인지 모르고 처음으로이 기사의 틀 안에서 작업하려고 노력할 것입니다. 아래 코드가 작동한다는 것을 보장 할 수있는 유일한 것은 내 문구는 내가이 모든 것을 어떻게 이해하는지에 대한 가정과 추측 일뿐입니다. 그래서 가자 ...

소개

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

일반적인 접근

웹 서비스에는 항상 클라이언트와 서버가 있습니다. 서버는 웹 서비스이며 때로는 엔드 포인트라고도합니다 (예 : SOAP 메시지 클라이언트에서). 다음을 수행해야합니다.
  1. 웹 서비스의 인터페이스 설명
  2. 이 인터페이스 구현
  3. 웹 서비스 시작
  4. 클라이언트를 작성하고 필요한 웹 서비스 메서드를 원격으로 호출합니다.
웹 서비스를 시작할 수 있습니다. 다른 방법들: 기본 메소드로 클래스를 선언하고 웹 서비스를 서버로 직접 실행하거나 Tomcat 등의 서버에 배포합니다. 두 번째 경우에는 우리 자신이 새 서버를 시작하지 않고 컴퓨터에서 다른 포트를 열지 않고 Tomcat 서블릿 컨테이너에 "우리는 여기에 웹 서비스 클래스를 작성했습니다. 게시하십시오. 웹 서비스 "를 사용할 수 있습니다. 웹 서비스를 시작하는 방법에 관계없이 동일한 클라이언트를 갖게됩니다.

섬기는 사람

IDEA를 시작하고 새 프로젝트를 만들어 보겠습니다. 새 프로젝트 생성... 이름을 입력합시다 HelloWebService 버튼을 누르세요 다음, 버튼 ... 폴더에서 src 패키지 생성 ru.javarush.ws... 이 패키지에서는 HelloWebService 인터페이스 인 package ru를 생성합니다. javarush. ws; // 주석입니다. 클래스와 메소드를 표시하는 방법, // 웹 서비스 기술과 관련 import javax. jws. WebMethod; import javax. jws. 웹 서비스; import javax. jws. 비누. SOAPBinding; // 인터페이스가 웹 서비스로 작동한다고 말합니다. @웹 서비스 // 웹 서비스가 메서드를 호출하는 데 사용될 것이라고 말합니다. @SOAPBinding (스타일 \u003d SOAPBinding. Style. RPC) 공용 인터페이스 HelloWebService ( //이 메서드는 원격으로 호출 할 수 있다고 말합니다. @WebMethod public String getHelloString (문자열 이름); )이 코드에서 WebService 및 WebMethod 클래스는 소위 주석이며 인터페이스와 해당 메소드를 웹 서비스로 표시하는 것 외에는 아무것도하지 않습니다. SOAPBinding 클래스도 마찬가지입니다. 유일한 차이점은 SOAPBinding이 매개 변수 주석이라는 것입니다. 이 경우 스타일 매개 변수는 웹 서비스가 문서 메시지를 통해서가 아니라 클래식 RPC로 작동한다는 값과 함께 사용됩니다. 메서드를 호출합니다. 인터페이스의 로직을 구현하고 패키지에 HelloWebServiceImpl 클래스를 생성 해 보겠습니다. 그건 그렇고, Impl에서 클래스의 끝은 Java의 규칙이며, 이에 따라 인터페이스 구현이 이러한 방식으로 표시됩니다 (Impl-단어 구현, 즉 구현). 이것은 요구 사항이 아니며 원하는 클래스 이름을 자유롭게 지정할 수 있지만 좋은 형식의 규칙에는 패키지 ru가 필요합니다. javarush. ws; // 인터페이스를 설명 할 때와 동일한 주석, import javax. jws. 웹 서비스; // 여기서는 endpointInterface 매개 변수와 함께 사용됩니다. // 웹 서비스 인터페이스의 정규화 된 클래스 이름 지정 @WebService (endpointInterface \u003d "ru.javarush.ws.HelloWebService") 공용 클래스 HelloWebServiceImpl은 HelloWebService를 구현합니다 (@Override public String getHelloString (String name) ( // 인사말을 반환합니다. return "Hello,"+ name + "!" ; )) 웹 서비스를 독립적 인 서버로 시작합시다. Tomcat 및 애플리케이션 서버의 개입없이 (이는 별도의 논의를위한 주제입니다). 이렇게하려면 폴더의 프로젝트 구조에서 src ru.javarush.endpoint 패키지를 생성하고 그 안에 기본 메소드 인 package ru를 사용하여 HelloWebServicePublisher 클래스를 생성합니다. javarush. 끝점; // 웹 서비스로 웹 서버를 시작하는 클래스 import javax. xml. ws. 끝점; // 웹 서비스 클래스 수입 ru. javarush. ws. HelloWebServiceImpl; 공용 클래스 HelloWebServicePublisher (공개 정적 무효 메인 (문자열 ... 인수) ( // 1986 포트에서 웹 서버 시작 // 첫 번째 인수에 지정된 주소에서 // 두 번째 인수에 전달 된 웹 서비스 시작 끝점. 게시 ( "http : // 로컬 호스트 : 1986 / wss / hello", 새로운 HelloWebServiceImpl ()); )) 이제 클릭하여이 클래스를 실행하겠습니다. Shift + F10... 콘솔에 아무것도 나타나지 않지만 서버가 실행 중입니다. 브라우저에 http : // localhost : 1986 / wss / hello? Wsdl 줄을 입력하여이를 확인할 수 있습니다. 한편으로 열리는 페이지는 웹 서버 (http : //)가 포트 1986의 컴퓨터 (localhost)에서 시작되었음을 입증하고 다른 한편으로는 웹 서비스의 WSDL 설명을 보여줍니다. 응용 프로그램을 중지하면 웹 서비스 자체와 같이 설명을 사용할 수 없으므로이를 수행하지 않고 클라이언트 작성을 진행합니다.

고객

프로젝트 폴더에서 src ru.javarush.client 패키지를 만들고 여기에 기본 메서드 인 package ru를 사용하여 HelloWebServiceClient 클래스를 만듭니다. javarush. 고객; // wsdl 설명을 얻고 그것을 통해 필요 // 웹 서비스 자체에 도달 수입 자바. 그물. URL; // URL 객체로 작업 할 때 이러한 실행이 발생합니다. 수입 자바. 그물. MalformedURLException; // wsdl 설명으로 xml을 구문 분석하는 클래스 // 그 안에있는 서비스 태그에 도달 import javax. xml. 네임 스페이스. QName; import javax. xml. ws. 서비스; // 웹 서비스의 인터페이스 (더 필요) 수입 ru. javarush. ws. HelloWebService; 공용 클래스 HelloWebServiceClient (공개 정적 무효 메인 (문자열 인수)가 MalformedURLException ( // wsdl 설명에 대한 링크 생성 URL URL \u003d 새 URL ( "http : // 로컬 호스트 : 1986 / wss / hello? wsdl") ; // WSDL 설명의 첫 번째 태그 인 정의에서 다음 생성자의 매개 변수를 살펴 봅니다. // targetNamespace 속성의 첫 번째 인수 참조 // name 속성의 두 번째 인수 참조 QName qname \u003d 새 QName ( "http://ws.javarush.ru/", "HelloWebServiceImplService"); // 이제 wsdl 설명에서 서비스 태그에 도달 할 수 있습니다. 서비스 서비스 \u003d 서비스. 생성 (URL, qname); // 그런 다음 중첩 된 포트 태그까지 // 원격 웹 서비스 객체에 대한 링크를 얻습니다. HelloWebService hello \u003d 서비스. getPort (HelloWebService. 클래스); // 만세! 이제 원격 메서드를 호출 할 수 있습니다. 체계. 밖. println (hello. getHelloString ( "CodeGym")); )) 나는 목록의 코드에 대해 최대한의 의견을 제시했습니다. 추가 할 항목이 없으므로 (Shift + F10)을 실행합니다. 콘솔에 다음 텍스트가 표시되어야합니다. Hello, CodeGym! 보지 못했다면 웹 서비스를 시작하는 것을 잊었을 것입니다.

결론

이 주제에서는 웹 서비스에 대한 간략한 소개가 제공되었습니다. 다시 말하지만, 제가 쓴 많은 것은 그것이 어떻게 작동하는지에 대한 추측입니다. 그러므로 너무 많이 신뢰해서는 안됩니다. 지식이 풍부한 사람들이 나를 고쳐 주면 감사 할 것입니다. 왜냐하면 나는 무언가를 배울 것이기 때문입니다. UPD.

페이지 2/3

WSDL로 설명

SOAP는 웹 서비스에 대한 모든 것을 알고 있다면 매우 잘 작동합니다. 그러나 항상 그런 것은 아닙니다. WSDL (Web Services Description Language)은 웹 서비스에 액세스하기위한 인터페이스를 설명하는 데 사용됩니다. 이 표준은 IBM, Microsoft 및 webMethods가 공동으로 개발했습니다. 세 회사는 각각 웹 서비스를 설명하기위한 표준을 개발하는 방법을 가지고있었습니다. IBM은 NASSL을, Microsoft는 SCL을, webMethods는 WIDL을 만들었습니다.

공동 작업의 결과는 WSDL 언어 1.1 버전이었으며, W3C와 관련하여 SOAP와 마찬가지로 버전 1.1 기반의 W3C는 현재 W3C 권장 사항 인 WSDL 1.2 버전을 개발했습니다. 웹 서비스 용 WSDL에는 사용 가능한 메소드 및 해당 매개 변수를 포함하여 서비스를 사용하는 데 필요한 모든 정보가 포함되어 있습니다. 이 정보는 다음 5 가지 요소에 포함됩니다.

  • -지원되는 프로토콜.
  • -웹 서비스 메시지 (요청, 응답).
  • 사용 가능한 모든 방법.
  • -서비스 URI.
  • -사용 된 데이터 유형.

이 모든 정보는 WSDL 설명의 루트 요소에 저장됩니다. 아래 목록은 웹 서비스에 대한 WSDL 설명의 예를 보여줍니다.

WSDL 웹 서비스 설명

예 ... 유리 없이는 알아낼 수 없지만 이것은 가장 간단한 (!) WSDL 파일 중 하나입니다. 불행히도 PHP 5 용 SOAP 확장의 단점 중 하나는 다른 SOAP 구현과 달리 WSDL 설명을 자동으로 생성하지 않는다는 것입니다 (적어도 아직). 확실히이 결함은 향후 PHP 버전에서 수정 될 것입니다.

그건 그렇고!

PHP에서 대체 SOAP 구현을 사용하여 WSDL 설명을 자동으로 생성 할 수 있습니다.

UDDI로 디렉토리 검색

이제 웹 서비스에 대한 정보를 얻는 방법과 요청하는 방법을 알았으므로 이러한 서비스를 찾는 방법을 배워야합니다. 이를 위해 Yellow Pages, 즉 UBR (Universal Business Registries)-웹 서비스 디렉토리와 유사한 것이 있습니다.

IBM, Microsoft, NTT-Com 및 SAP의 레지스트리를 포함하여 여러 레지스트리가 있습니다. 이러한 레지스트리는 데이터를 동기화하므로 모든 데이터를 사용할 수 있습니다. UDDI 표준의 현재 버전은 UDDI 3.0이지만 대부분의 구현은 버전 2를 사용합니다.이 표준의 개발자 중에는 HP, Intel, Microsoft 및 Sun과 같은 거대 기업이 있습니다.

UBR과 상호 작용하려면 두 가지 유형의 API : 조회 API 및 게시 API... 상호 작용 문의 API는 요청 용입니다. UBR 레지스트리의 서비스 및 인터페이스 개발자는 Publish API를 사용하여 서비스를 등록 할 수 있습니다.... 스팸으로 레지스트리의 내용을 채우는 것은 시간 문제인 것 같습니다. :)

그건 그렇고!

서비스 등록을 "실제"레지스트리에 배치하기 전에 테스트하기위한 테스트 레지스트리가 있습니다.

웹 서비스 요청은 다음과 같습니다.

sortByNameAsc sortByDateDesc % guid %

위의 예에서 UDDI 요청이 SOAP 메시지에 캡슐화되어 있다는 것을 알 수 있으므로 매우 익숙해 보입니다. 요청에 대한 응답은 아래 표시된 SOAP 문서이기도합니다.

웹 서비스 가이드 투어 Guided Tourbook 용 샘플 웹 서비스 가이드 투어 StockQuote 서비스

설치

PHP5 용 SOAP 확장을 설치하는 것은 매우 쉽습니다. Windows에서이 모듈은 PHP 설치 디렉토리의 ext 하위 디렉토리에 있습니다. 이를 사용하려면 php.ini 파일에 다음 행을 추가하십시오. 확장자 \u003d php_soap.dll 이 모듈이 작동하려면 최소한 Windows 버전에는 기본적으로 PHP 5에 포함되어 있어야합니다.

XSD : XML 스키마 정의.

XML : 확장 가능한 마크 업 언어.

WSDL : 웹 서비스 정의 언어.

나는 기술적으로 대답하지 않을 것입니다. 나는이 설명을 초보자들에게 지시하고있다.

서로 다른 두 기술을 사용하여 개발중인 서로 다른 두 응용 프로그램간에 통신하는 것은 쉽지 않습니다. 예를 들어 시카고의 한 회사는 Java를 사용하여 웹 애플리케이션을 개발하고 뉴욕의 다른 회사는 C #으로 애플리케이션을 개발할 수 있으며 두 회사가 정보를 교환하기로 결정하면 XML이 그림에 나타납니다. 서로 다른 기술을 사용하여 개발 된 두 개의 서로 다른 응용 프로그램간에 데이터를 저장하고 전송하는 데 도움이됩니다. 노트. 이것은 프로그래밍 언어에 국한되지 않습니다. 서로 다른 두 응용 프로그램 간의 정보 전송을 조사하십시오.

XSD는 스키마 정의입니다. 즉, 사용자에게 이러한 스키마로 XML을 디자인하도록 지시합니다. 아래 이미지를보고 "시작시로드"요소와 그 유형 (정수)을 자세히 살펴보십시오. XSD 이미지에서 "시작시로드"에 대한 정수 값임을 알 수 있으므로 사용자가 XML을 만들 때 int 값을 해당 특정 요소에 전달했습니다. XSD는 스키마이자 스타일 인 반면 XML은 다른 응용 프로그램이나 시스템과 통신하기위한 형식이라는 점을 기억하십시오. XSD를보고 그런 식으로 XML을 만들어야합니다. 그렇지 않으면 다른 기술을 사용하여 개발 된 다른 응용 프로그램이나 시스템과 통신 할 수 없습니다. 시카고 회사는 텍사스 회사가이 XSD 형식으로 XML을 작성하거나 생성 할 수 있도록 XSD 템플릿을 제공합니다. 텍사스 회사가 XSD에 언급 된 규칙이나 계획을 준수하지 않으면 시카고 회사로부터 올바른 정보를 기대할 수 없습니다. 위의 이야기 이후에, 내가 위에서 말한 것과 같은 것들을 코딩하는 동안 애호가 나 초보자가 알아야 할 것이 훨씬 더 많습니다. 다음에 무엇이 올지 정말로 알고 싶다면 실제로 웹 서비스를 개발 한 선임 소프트웨어 엔지니어와 함께 앉는 것이 가장 좋습니다. 다음으로 WSDL이 나옵니다. 이미지를 따라 WSDL이 어디에 적합한 지 알아 내십시오.

*************** \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d 아래는 부분 XML 이미지입니다. \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d ********* ** * ***

*************** \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d 아래는 부분적인 XSD 이미지입니다 \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d ********* ** * ***

*************** \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d 아래는 WSDL의 일부 이미지입니다. \u003d\u003d\u003d\u003d\u003d\u003d\u003d *********** **

Book이라는 웹 서비스에 대한 샘플 WSDL을 만들어야했습니다. 이것은 XSD이지만 웹 서비스에 매우 특정하기 때문에 WSDL (Web Services Definition Language)로 이름을 지정해야합니다. Book.java 클래스에 대해 WSDL (또는 XSD) 아래에 생성되어 SOAP 서비스를 생성합니다. SOAP 웹 서비스가 생성 된 방법은 다른 주제입니다. Java 클래스를 작성해야하며이를 웹 서비스로 작성하기 전에 사용자는 Axis2 API가 설치되어 있고 Tomcat이 웹 서비스를 제자리에 호스팅하는지 확인해야합니다.

서비스 제공 업체 (다른 사람 (고객)가 자신의 시스템에서 정보 나 데이터에 액세스 할 수 있도록 허용하는 사람)는 실제로 고객 (서비스 제공 업체의 정보 또는 데이터를 사용해야하는 사람)에게 웹 서비스를 통해 데이터에 대한 전체 액세스 권한을 부여합니다. 지구상의 어느 회사도 외부인과 데이터베이스를 공유 할 준비가되어 있지 않습니다. 우리 회사와 마찬가지로 웹 서비스를 통해 일부 제품 정보를 제공하기로 결정했기 때문에 XSD 템플릿을 만들고 우리와 함께 일하고자하는 일부 고객을 넘겨야했습니다. 그들은 주어진 XSD를 최대한 활용하기위한 코드를 작성하고 서비스 제공자로부터 데이터를 검색하고 반환 된 데이터를 적절한 요청으로 변환하기 위해 웹 서비스 호출을 수행 한 다음 웹 사이트에 데이터 또는 제품 정보를 표시하거나 게시해야합니다. 간단한 예는 항공편 예약 FLIGHT입니다. 항공사는 제 3자가 웹 사이트의 항공편 정보를 사용하여 항공권을 판매 할 수 있도록 허용합니다. 그러나 다시 한 번 더 많은 것이 있습니다. 타사 항공권 대행사가 티켓을 판매하는 것을 허용하지 않는 것만으로도 동기화 및 보안이 제자리에있을 것입니다. 동기화가 없으면 한 명 이상의 고객이 다른 출처에서 동일한 항공권을 구매할 수있는 확률이 100 %입니다.

전문가들이 내 대답에 기여하기를 바랍니다. 초보자 나 초보자가 XML, XSD를 이해하고 웹 서비스로 작업하는 것은 매우 어렵습니다.

기사가 마음에 드 셨나요? 친구와 공유하려면 :