gSOAP

gSOAP
gSOAP
개발자로버트 판 엥겔렌
초기 릴리즈2000년 12월 8일, 21년(2000-12-08)
안정된 릴리스
2.8.107 / 2020년 10월 6일 (2020-10-06)
저장소
기입처C 및 C++
운영 체제크로스 플랫폼
유형웹 개발 소프트웨어
면허증.GPL v2, 상용 라이선스
웹 사이트https://www.genivia.com/dev.html
https://sourceforge.net/projects/gsoap2/

gSOAP은 SOAP/XML서비스범용 XML 데이터 바인딩을 위한 C 및 C++ 소프트웨어 개발 툴킷입니다.일련의 C/C++ 타입 선언을 지정하면 컴파일러 기반의 gSOAP 툴은 지정된 C 및 C++ 데이터 구조의 효율적인 XML 시리얼화를 위해 소스 코드로 시리얼라이제이션 루틴을 생성합니다.시리얼화는 복사 오버헤드가 발생하지 않습니다.

역사

GSOAP 툴킷은 1999년 로버트 반 엥겔렌 교수가 플로리다 주립대학의 연구 프로젝트로 시작했다.이 프로젝트에서는 XML에서 직접 C/C++ 데이터를, 나중에 SOAP에서도 C/C++ 데이터의 고효율 XML 구문 분석(풀 구문 분석)[3][4] 및 직렬화를 위한 새로운[2] 방법을 도입했습니다.[5] 프로젝트는 XML 스키마 유형과 다양한 C/C++ 데이터 유형 간의 안전데이터 바인딩을 정의하는 데 성공했습니다.툴킷은 자동 프로그래밍을 사용하여 효율적인 자동 생성 XML 시리얼라이저를 사용하여 웹 서비스 개발과 호출을 단순화하고 C/C++ 데이터를 직접 송수신합니다.도메인 고유의 컴파일러 기반 툴은 네이티브 C/C++ 데이터 구조를 XML로 효율적으로 [1]변환하는 소스 코드를 생성합니다.툴킷은 비슷한 시기에 도입된 SOAP 웹 서비스 메시징 프로토콜을 지원하기 위해 개발되었으며, 따라서 "gSOAP"(일반 XML SOAP)라는 이름을 지원하고 과학적 데이터 [6]교환을 위한 접근방식을 사용하기 위해 개발되었습니다.소프트웨어의 추가 개발과 유지보수는 Genivia Inc.의 소유하에 이루어졌다.이 새로운 WebServicesDescriptionLanguage과 XML스키마 처리 능력의 추가뿐만 아니라 웹 서비스 보안 optimizations,[7]XML-RPC 메시징, JSON데이터 형식에 대한 지원, 플러그 모듈 아파치고 IIS웹 서버에 gSOAP와 통합하기와 같은 그리드 사용 가능을 제3자 플러그 인 같은 많은 WS-* 웹 서비스 프로토콜 기능의 추가가 포함됩니다.vices.[8][9] gSOAP 툴킷은 휴대용 C/C++로 작성되며 WSDL/XSD 메타 데이터 바인딩을 위한 C/C++ 소스 코드로 변환하는 변환기를 구현하기 위해 자체 코드를 생성함으로써 부트스트랩 형식을 사용합니다.GSOAP 소프트웨어는 GPLv2 오픈소스 라이선스와 상용 소스 코드 라이선스로 라이선스됩니다.GSOAP 소프트웨어는 산업 프로젝트[10] 및 미션 크리티컬 인프라에서 널리 사용됩니다.

예에 의한 XML 웹 서비스 조작

다수의 투숙객이 주어진 호텔의 숙박료를 검색하는 C의 웹 서비스 운영 예는 다음과 같이 주석 형식으로 선언할 수 있다.

//gsoap ns 서비스 네임스페이스: tempuri //gsoap NS 서비스 스타일: 문서 //gsoap NS 서비스 부호화: 리터럴 인트 ns_get_rate(* 호텔, 인트 손님들, 흘러가다 *평가하다); 

함수의 마지막 파라미터는 항상 서비스 리턴값입니다.이는 단방향 동작의 경우 void로 표시될 수 있으며 여러 서비스 리턴 파라미터를 번들하기 위한 구조/클래스여야 합니다.함수의 int 반환값은 오류 진단에 사용됩니다.

자동 생성된 soap_call_ns_get_rate 함수를 사용하여 C에서 서비스 호출을 다음과 같이 수행합니다.

컨스턴트  *URL = "http://www.example.com/hotels"; 컨스턴트  *액션. = 특수한 순서; 구조 비누. *ctx = soap_new();  // 새 컨텍스트 흘러가다 평가하다; 인트 에러 = soap_call_ns__get_rate(ctx, URL, 액션., 해피인, 2, &평가하다); 한다면 (에러 == SOAP_OK & & 평가하다 < > 100.00)   렛츠고(); soap_end(ctx);   // 역직렬화된 데이터 할당 해제 비누를 사용하지 않다(ctx);  // 컨텍스트 할당 해제 

레거시 C 및 C++ 시스템의 웹 서비스 구현을 용이하게 하기 위해 C/C++ 내의 식별자 이름의 프리픽스 수식을 생략하거나 콜론 표기(예: ns_get_rate 대신 ns:get_rate)로 대체할 수 있습니다.프로젝트 빌드에 사용되는 자동 생성된 소스 코드에서 구두점이 제거됩니다.

자동 생성된 Proxy 클래스를 사용하여 C++에서 서비스 호출이 다음과 같이 실행됩니다(프록시의 기본 엔드포인트 URL 및 SOAP 액션 값 사용).

프록시 프록시; 흘러가다 평가하다; 인트 에러 = 프록시.get_rate(해피인, 2, &평가하다); 한다면 (에러 == SOAP_OK & & 평가하다 < > 100.00)   렛츠고(); 프록시.파괴하다();  // 역직렬화된 데이터 할당 해제 

주석 및 식별자 명명 규칙을 사용하여, 즉 함수 ns_get_rate에 대한 접두사 ns__를 가진 자격 증명을 사용하고, 예제에서 //gsoap 지시어를 사용하여 ns 네임스페이스의 속성을 선언함으로써 웹 서비스 작업에 대한 바인딩을 확립합니다.자동 생성된 Web Services Description Language(WSDL) 문서는 다음과 같이 ns_get_rate 함수의 요구 메시지, 응답 메시지 및 get-rate 동작 portType 인터페이스와 SOAP 바인딩을 선언합니다.

<정의명="Service" target Namespace="tempuri" xmlns:tns="tempuri" xmlns:ns="tempuri" xmlns="http://schemas.xmlsoap.org/wsdl/"> ...<message name="get-rateRequest"> <part name="parameters" element="get-rate"/> </message> </message> <part name="parameters" element=" ns:get-rate Response"/> </message> </type name="ServicePortType"> <조작명="get-rate"> <input message="tns:get-rateRequest"/> <output message="tns:get-rateResponse"/> </operation> </portType> <바인딩명="Service" type="tns:ServicePortType">,>SOAP:style="문서"transport="http://schemas.xmlsoap.org/soap/http"/>,<>작업 name="get-rate"> 결합,<>.SOAP운전 soapAction=""/>,<>input>,<>SOAP:몸 parts="매개 변수"use="리터럴"/>, <, /input>,<>output>,<>.SOAP:몸 parts="매개 변수"use="리터럴"/>, <, /output>,<>/operation>,<>/binding&gt을 말한다.

여기서 동작 요구 및 응답 메시지는 다음과 같이 WSDL의 types 섹션에서 정의된 XML 요소를 나타냅니다.

<타입>  <클라이언트> target Namespace='부리' ...>    <클라이언트> 이름="get-rate">    <콤플렉스 타입>     <시퀀스>      <클라이언트> 이름="실패" 입력="xsd: 문자열" minoccurs="0" maxOccurs="1" 무효="진짜"/>      <클라이언트> 이름="실패" 입력="xsd:int" minoccurs="1" maxOccurs="1"/>     </시퀀스>    </complex Type>   </filters>   <클라이언트> 이름="get-rate Response">    <콤플렉스 타입>     <시퀀스>      <클라이언트> 이름='레이트' 입력="xsd: 삭제" minoccurs="0" maxOccurs="1" 무효="진짜"/>     </시퀀스>    </complex Type>   </filters>  </filters> </types> 

마찬가지로 클라이언트 및 서버 C/C++ 소스 코드는 WSDL 및 XML 스키마 세트에서 자동으로 생성할 수 있습니다.적절한 서비스 오퍼레이션을 정의함으로써 서비스를 완료해야 합니다.예를 들어 get_rate 메서드를 다음과 같이 정의함으로써 이 WSDL의 자동 생성된 C++ 서비스 클래스를 완료해야 합니다.

인트 서비스:: get_rate( *호텔, 인트 손님들, 흘러가다 *평가하다) {   *평가하다 = ...  // 투숙객 수에 따라 호텔 숙박 요금을 결정합니다.   돌아가다 SOAP_OK; } 

데이터 바인딩을 확립하려면 특정 유형의 선언 규칙 및 주석을 따라야 한다는 점을 제외하고 웹 서비스 메시징에 대해 XML로 마샬링할 수 있는 동작 파라미터 유형에 대한 제한은 없습니다.

예에 의한 XML 데이터 바인딩

C/C++ 데이터 유형을 사용하여 XML 데이터 바인딩을 확립하기 위해 gSOAP에서는 명령어, 식별자 명명 규칙 및 구두점의 세 가지 기본 형식의 소스 코드 주석을 사용합니다.

계층적 직원 레코드에 대한 C의 완전한 주석 구조 선언은 다음과 같이 표시될 수 있습니다.

//gsoap ns 스키마 네임스페이스: tempuri //gsoap ns 스키마 형식: 수식 구조 ns_secords_record {    @  *xml_module  = "en";    @인트    아이디         = 9999;       *full_name         1:1;         $int    크기              0:12;     구조 ns_secords_record *관리하다; }; 

여기서는 다음과 같은 주석 및 표기법이 사용됩니다.

  • 식별자 명명 규칙에 의한 유형 및 멤버 네임스페이스 수식: ns_disc_record, xml_discl
  • 멤버 속성: @char*, @int
  • 멤버 기본값: xml_defaults = "en", ID = 9999
  • minOccurs 형식의 발생 제약 조건: maxOccurs for XML 검증: full_name 1:1, size 0:12
  • 요소 시퀀스의 동적 배열은 특수 크기 필드와 배열 포인터 멤버 쌍으로 구성됩니다. $int size; structure ns_secord *secord

GSOAP 도구는 C/C++ 데이터 유형을 XML 스키마 데이터 유형으로 변환합니다.C는 네임스페이스를 지원하지 않으며 구조체/클래스 멤버 이름은 C++에서 네임스페이스 수식할 수 없으므로 gSOAP에서 식별자 명명 규칙을 사용하면 이 구조체와 해당 멤버를 다음과 같이 자동 생성되는 XML 스키마 complexType에 바인딩할 수 있습니다.

<클라이언트> target Namespace='부리' xmlns:ns='부리'   xmlns: xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema"   elementFormDefault="적격" attributeFormDefault="적격">    <복잡한 타입 이름="음반">    <시퀀스>     <클라이언트> 이름=풀네임 입력="xsd: 문자열" minoccurs="1" maxOccurs="1" 무효="진짜"/>     <클라이언트> 이름="실패" 입력="ns: 녹음 레코드" minoccurs="0" maxOccurs="12"/>    </시퀀스>    <클라이언트> 참조="xml: 삭제" 사용="디폴트" 디폴트="en"/>    <클라이언트> 이름=아이디 입력="xsd:int" 사용="디폴트" 디폴트="9999"/>   </complex Type>  </filters> 

또한 유니언 멤버 선택을 위한 특별한 셀렉터 필드로 주석을 붙인 구조/클래스 내의 유니언은 스키마 선택 입자와 매핑되고 STL 컨테이너는 시퀀스 입자와 매핑되며 열거는 XML 스키마 심플하게 매핑된다.유형 열거 및 표준 C/C++ 프리미티브 유형이 XSD 유형에 매핑됩니다.XSD 스키마를 C/C++ 데이터 유형으로 변환하는 경우 실제 매핑은 유형 매핑 파일을 사용하여 gSOAP에서 구성할 수 있습니다.

예를 들어 계층적 직원 구조의 인스턴스는 기본 트리로 XML에서 직렬화됩니다.

<ns:syslog xmlns:ns="sysloguri" xml:syslog="en" ns:ID="12"> <ns: full-name> Jane Doe </ns: full-name> <ns:param xml="en" ns:ID="34"> <ns: 풀네임>John Doe </ns: full-name> </ns:filen> <ns:filen xml="en" ns:ID="56"> <ns:full-name> Bob Oz </ns:full-name> <ns:param xml="en" ns:ID="78"> <ns: 풀네임>Alice Oz </ns: full-name> </ns:manages> </ns:manages> </ns:employee>

SOAP 부호화 스타일이 네이블일 경우 SOAP 부호화 규칙에 따라 gSOAP의 XML 시리얼화는 참조된 오브젝트 및 순환 데이터 구조를 존중하며 id-ref 엣지를 가진 XML이 생성됩니다.

자동 생성된 XML 데이터 바인딩에는 파일, 문자열 또는 스트림과의 읽기 및 쓰기 작업이 포함됩니다.예를 들어, ns__employee_record 개체에는 다음과 같은 읽기 및 쓰기 작업이 있습니다.

인트 soap_read_ns_soap_record(구조 비누.*, ns_secords_record*); 인트 soap_write_ns_soap_record(구조 비누.*, 컨스턴트 ns_secords_record*); 

XML 파일에서 직원 레코드를 읽으려면:

구조 비누. *ctx = soap_new(); ctx->인식하다 = 열다.("syslog.xml", O_RDONLY); 한다면 (ctx->인식하다) {   ns_secords_record 직원;   한다면 (soap_read_ns_soap_record(ctx, &직원) == SOAP_OK)     ...   가까운.(ctx->인식하다); } soap_end(ctx); soap_interface(ctx); // 직원 데이터도 삭제합니다. 비누를 사용하지 않다(ctx); 

구문 분석된 XML은 데이터 바인딩의 제약 조건에 대해 내부적으로 검증됩니다.

XML REST API

애플리케이션 데이터는 REST XML 서비스와 송수신 할 수 있습니다.XML 데이터 바인딩은 REST XML API 콜을 제공합니다.예를 들어 이전 섹션의 ns__employee_record XML 데이터 바인딩을 지정하면 다음 GET, PUT 및 POST 작업이 자동으로 생성됩니다.

인트 soap_GET_ns__employee_record(구조 비누.*, 컨스턴트  *URL, ns_secords_record*); 인트 soap_PUT_ns__employee_record(구조 비누.*, 컨스턴트  *URL, 컨스턴트 ns_secords_record*); 인트 soap_POST_send_ns_employee_record(구조 비누.*, 컨스턴트  *URL, 컨스턴트 ns_secords_record*); 인트 soap_POST_recv_ns_employee_record(구조 비누.*, ns_secords_record*); 

POST 함수는 함께 호출해야 합니다.처음에는 XML 데이터를 엔드포인트 URL로 전송하기 위해 POST_send를 호출한 후 응답 데이터를 받아들이기 위해 POST_recv를 호출해야 합니다(다른 유형일 수 있습니다).

수신된 XML은 데이터 바인딩의 제약에 대해 내부적으로 검증됩니다.

특징들

레퍼런스

  1. ^ a b van Engelen, Robert (2008). "A Framework for Service-Oriented Computing with C and C++ Web Service Components". ACM Transactions on Internet Technology. 8 (3): 106–115. doi:10.1145/1361186.1361188.
  2. ^ a b van Engelen, Robert; Gallivan, Kyle (2002). The gSOAP Toolkit for Web Services and Peer-To-Peer Computing Networks. IEEE International Symposium on Cluster Computing and the Grid. pp. 128–135.
  3. ^ Head, Michael; Govinderaju, Madhu; Slominski, Aleksander; Liu, Pu; Abu-Ghazaleh, Nayef; van Engelen, Robert; Chiu, Kenneth (2005). Benchmarking XML Processors for Applications in Grid Web Services. IEEE/ACM Supercomputing (SC).
  4. ^ Head, Michael; Govinderaju, Madhu; van Engelen, Robert; Zhang, Wei (2006). Benchmarking XML Processors for Applications in Grid Web Services. IEEE/ACM Supercomputing (SC).
  5. ^ van Engelen, Robert; Govindaraju, Madhu; Zhang, Wei (2006). Exploring Remote Object Coherence in XML Web Services. International Conference on Web Services (ICWS). pp. 249–256.
  6. ^ van Engelen, Robert (2003). Pushing the SOAP Envelope with Web Services for Scientific Computing. Conference on Web Services (ICWS). pp. 346–354.
  7. ^ Robert, van Engelen; Zhang, Wei (2008). An Overview and Evaluation of Web Services Security Performance Optimizations. IEEE International Conference on Web Services (ICWS). pp. 137–144.
  8. ^ Aloisio, Giovanni; Cafaro, Massimo; Epicoco, Italo; Lezzi, Daniele; van Engelen, Robert (2005). The GSI plug-in for gSOAP: Enhanced Security, Performance, and Reliability. International Conference on Information Technology (ITCC). pp. 304–309.
  9. ^ Cafaro, Massimo; Lezzi, Daniele; Fiore, Sandro; Aloisio, Giovanni; van Engelen, Robert (2007). The GSI plug-in for gSOAP: building cross-grid interoperable secure grid services. International Conference on Parallel Processing and Applied Mathematics (PPAM) 2007, workshop on Models, Algorithms and Methodologies for Grid-enabled Computing Environment (MAMGCE), Springer Verlag LNCS Volume 4967. pp. 894–901.
  10. ^ Challener, David; Yoder, Kent; Catherman, Ryan; Safford, David; Van Doorn, Leendert (2007). A practical guide to trusted computing. Pearson Education.

「 」를 참조해 주세요.