- Back to Home »
- Networking »
- gSOAP
Saturday, October 17, 2015
Tương tự như XML-RPC thì SOAP cũng là một giao thức dùng để làm ứng dụng web service để server phục vụ yêu cầu của client, trong đó client gọi một function đến server để server thực hiện function đó và trả về kết quả.
Nếu so sánh thì XML-RPC thực sự đơn giản, dễ dàng để thực hiện trong khi đó SOAP thì phức tạp và mạnh mẽ hơn nhiều.
Trong bài viết này chúng ta sẽ tiến hành build thư viện gSOAP, viết ứng dụng client-server demo cho giao thức SOAP. Hiện tại gSOAP là một thư viện được dùng phổ biến bởi rất nhiều hãng lớn trên thế giới, nó vẫn liên tục được cập nhật và phát triển.
1. Build gSOAP
- Download source gSOAP (version gSOAP-2.8)
- Thư viện phụ thuộc
+ openssl
- Build gSOAP
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
export CROSS=arm-none-linux-gnueabi-
export HOST=arm-none-linux-gnueabi
DEPEND_LIB_DIR=/path/to/dependent/install
export CFLAGS=-I${DEPEND_LIB_DIR}/include
export CPPFLAGS=-I${DEPEND_LIB_DIR}/include
export LDFLAGS=-L${DEPEND_LIB_DIR}/lib
export PKG_CONFIG_PATH=${DEPEND_LIB_DIR}/lib/pkgconfig
export LD_LIBRARY_PATH=${DEPEND_LIB_DIR}/lib
export PATH=$PATH:${DEPEND_LIB_DIR}/bin:${DEPEND_LIB_DIR}/sbin
"buid soapcpp2 for host first"
./configure
make CC=gcc CXX=g++ -C gsoap/src
export PREFIX=/path/to/gsoap/install
./configure --prefix=$PREFIX --host=${HOST} \
CC=${CROSS}gcc \
CXX=${CROSS}g++ \
--with-openssl=${DEPEND_LIB_DIR}
"Modify config.h which have just is generated
comment #define malloc rpl_malloc
Note: fixbug ::malloc has not been declared
"
make
make install
2. Giới thiệu gSOAP
Sau khi build xong gSoap chúng ta sẽ có hai chương trình chính trong thư mục bin:
2.1 soapcpp2 (stub/skeleton generator)
soapcpp2 -c <name of generated .h file e.g chatpp.h> cho chương trình C
soapcpp2 <name of generated .h file> hoặc
soapcpp2 -i <name of generated .h file e.g chatpp.h> cho chương trình C++
Chương trình tạo ra các file.c và file.cpp implement các function đã define trong file.h
Trong gsoap-2.8/gsoap/bin/win32 đã có sẵn hai chương trình này cho Windows OS.
2.2 wsdl2h (schema importer)
wsdl2h <path and name of .wsdl file> -o <name of generated .h file e.g chatpp.h>
file.wsdl là file mô tả về các function/kết nối mà một web service nào đó đang chạy. Chương trình wsdl2h sẽ phân tích file.wsdl này để tạo ra file.h từ đó sẽ dùng để viết một chương trình client cho web service đã có đó.
2.3 Nguyên lý hoạt động gSOAP
3. Ví dụ
Xét ví dụ soap-2.8/gsoap/samples/calc và soap-2.8/gsoap/samples/calc++
calc.h
File này định nghĩa các function và các cài đặt về gsoap ns.
//gsoap ns service name: calc Simple calculator service
//gsoap ns service protocol: SOAP
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service namespace: http://10.49.46.201:2012/calc.wsdl
//gsoap ns service location: http://10.49.46.201:2012
//gsoap ns schema namespace: urn:calc
Với http://10.49.46.201:2012 máy Server có địa chỉ IP: 10.49.46.201, serrvice chạy qua port 2012.
Build ứng dụng calc:
DEPEND_LIB_DIR=/path/to/gsoap-2.8-host/install
export CFLAGS="-I${DEPEND_LIB_DIR}/include -DWITH_OPENSSL"
export CPPFLAGS=-I${DEPEND_LIB_DIR}/include
export LDFLAGS=-L${DEPEND_LIB_DIR}/lib
export PKG_CONFIG_PATH=${DEPEND_LIB_DIR}/lib/pkgconfig
export LD_LIBRARY_PATH=${DEPEND_LIB_DIR}/lib
export PATH=$PATH:${DEPEND_LIB_DIR}/bin:${DEPEND_LIB_DIR}/sbin
export LIBS="-lm -lssl -lcrypto -lpthread"
Copy stdsoap2.c stdsoap2.h from gsoap-2.8/gsoap to samples/calc
Copy stdsoap2.cpp stdsoap2.h from gsoap-2.8/gsoap to samples/calc++
Compilation in C (see samples/calc):
soapcpp2 -c calc.h
cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c ${CFLAGS} ${LDFLAGS} ${LIBS}
cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c ${CFLAGS} ${LDFLAGS} ${LIBS}
Compilation in C++ (see samples/calc++):
soapcpp2 -i calc.h
cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp ${CFLAGS} ${LDFLAGS} ${LIBS}
cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp ${CFLAGS} ${LDFLAGS} ${LIBS}
Chạy chương trình
server
$ ./calcserver 2012
client
$ ./calcclient add 2 3