gSOAP
gSOAP개발자 | 로버트 판 엥겔렌 |
---|---|
초기 릴리즈 | 2000년 12월 | , 전
안정된 릴리스 | 2.8.107 / 2020년 10월 6일 ( |
저장소 | |
기입처 | 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>을 말한다.
여기서 동작 요구 및 응답 메시지는 다음과 같이 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은 데이터 바인딩의 제약에 대해 내부적으로 검증됩니다.
특징들
- 소스 간 코드 생성을 통한 자동 프로그래밍에 기반한 C 및 C++용 XML 데이터 바인딩
- ANSI C 및 ISO C++에서의 클라이언트/서버 소스 코드 자동 생성
- XML 검증을 통한 스키마 고유의 통합 고속 XML 풀 해석
- Web Services Description Language(WSDL) 1.1 및 2.0
- 웹 서비스 SOAP 1.1 및 1.2
- 스트리밍 메시지 전송 최적화 메커니즘(MTOM) 및 DIME/MIME 첨부 파일
- 표현 상태 전송(REST) HTTP(S) 1.0/1.1
- WS-I 기본 프로파일 1.0a, 1.1 및 1.2에 준거하고 있음을 확인.
- W3C 스키마 패턴의 데이터 바인딩, 완전한 테스트 패턴 범위 확인
- C 및 C++용 XML-RPC
- C 및 C++용 JSON
- RSS 0.91, 0.92, 2.0
- WS-보안
- WS-Policy 1.2, 1.5 및 WS-SecurityPolicy 1.2
- WS-Addressing 2003/03, 2004/03, 2005/03
- WS-Reliable Messaging 1.0 및 1.1
- WS-Discovery 1.0/1.1
- SOAP-over-UDP
- Universal Description Discovery and Integration(UDDI) v2 API
- HTTP 기본 및 다이제스트 인증, NTLM 인증, 프록시 인증
- SSL/TLS를 사용한IPv4 및 IPv6 (OpenSSL 또는 GNUTLS 기반)
- gzip을 사용한 XML 압축
- Apache 1.x 및 2.0 모듈, IIS ISAPI 및 WinInet 모듈, CGI 및 Fast CGI
- 스탠드아론 웹 서버 지원(멀티스레드, 풀링)
- 할당 해제 및 누출 검출을 통한 통합 메모리 관리
- 추가 기능을 위한 플러그인이 있는 아키텍처
- 국제화/현지화 지원(UTF8, UCS4, MB 인코딩 등)
- 플랫폼 뉴트럴, 소형 디바이스 지원(Symbian, VxWorks, Android, iPhone)
레퍼런스
- ^ 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.
- ^ 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.
- ^ 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).
- ^ Head, Michael; Govinderaju, Madhu; van Engelen, Robert; Zhang, Wei (2006). Benchmarking XML Processors for Applications in Grid Web Services. IEEE/ACM Supercomputing (SC).
- ^ 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.
- ^ van Engelen, Robert (2003). Pushing the SOAP Envelope with Web Services for Scientific Computing. Conference on Web Services (ICWS). pp. 346–354.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ Challener, David; Yoder, Kent; Catherman, Ryan; Safford, David; Van Doorn, Leendert (2007). A practical guide to trusted computing. Pearson Education.