- Back to Home »
- Networking »
- XML-RPC
Sunday, October 11, 2015
XML-RPC là gì ?
XML-RPC là một cài đặt RPC (Remote Procedure Call) trên nền giao thức HTTP, sử dụng XML để mã hoá và trao đổi dữ liệu.
Vậy RPC là gì?
Khi bạn viết chương trình, ắt hẳn bạn cũng đã quen với các khái niệm thủ tục và hàm. Các đoạn chương trình lặp đi lặp lại bạn viết lại thành 1 hàm (hay thủ tục) và sau đó khi dùng chỉ cần gọi thủ tục hoặc hàm đó với các tham số thích hợp. Các thủ tục hoặc hàm đó bạn có thể:
– Để chung trong 1 file nguồn cùng với chương trình chính,
– Để trong 1 file nguồn khác và được include vào file nguồn chính khi cần,
– Được biên dịch sẵn và để trong 1 thư viện hoặc unit để các chương trình khác của bạn (cùng được viết bằng 1 ngôn ngữ) sử dụng,
– Được biên dịch sẵn để trong file DLL để các chương trình (được viết bằng các ngôn ngữ khác nhau) sử dụng.
Điểm chung của tất cả các phương thức trên là các hàm và thủ tục cần gọi đều nằm trên cùng 1 máy với nơi gọi chúng. Tuy nhiên bạn có thể thấy là nơi gọi và hàm cần gọi có thể được tách rời nhau ra: từ chung file, đến khác file, rồi đến khác ngôn ngữ.
RPC – Remote Procedure Call (lời gọi hàm xa)
Là một mở rộng của lời gọi hàm (procedure call) theo cách cổ điển. Giờ đây hàm cần gọi và nơi gọi hàm có thể nằm ở 2 máy tính khác nhau; thậm chí có thể cách xa nhau nửa vòng trái đất, nối với nhau qua mạng internet.
Một ví dụ đơn giản của XML-RPC là tạo một web service caung cấp thông tin về thời tiết của một khu vực địa lý nào đó:
- XML-RPC client gọi một hàm có tên getWeatherInfo("DaNang City") với tham số đầu vào là địa điểm cần lấy thông tin là "DaNang City"
- Các thông tin sẽ được đóng gói và mã hóa dưới dạng XML, truyền đến XML-RPC server qua kết nối web thông thường là http(s)
- Server nhận request, mở gói, giải mã, thực hiện hàm getWeatherInfo và trả về kết quả lại cho XML-RPC client theo cách tương tự như khi client gửi thông tin đi
- Client nhận lai được response, mở gói, giải mã, phân tích và hiển thị thông tin nhận được.
Trong bài viết này sẽ hướng dẫn build một thư viện có tên XML-RPC for C and C++. Ngữ cảnh đặt ra trong bài viết này là chúng ta sẽ build chương trình XML-RPC client chạy trên máy tính và XML-RPC server chạy trên board nhúng (Mini2440)
Các bước thực hiện:
- Truy cập http://xmlrpc-c.sourceforge.net để download source code (xmlrpc-c-1.33.17)
- Tiến hành giải nén và build thư viện xmlrpc-c-1.33.17
Các thư viện phụ thuộc:
+ curl
+ libxml2
+ openssl
Xem hướng dẫn cross.
Build xmlrpc-c trên máy tính:
yum install libcurl-devel
yum install libxml2-devel
yum install openssl-devel
./configure --prefix=/path/to/xmlrpc/client/install
make
make install
Build xmlrpc-c cho board:
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
export CROSS=arm-none-linux-gnueabi-
export HOST=arm-none-linux-gnueabi
#first
./configure
make CC=gcc CXX=g++ -C lib/expat/gennmtab
#second
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
PREFIX=/path/to/xmlrpc/server/install
./configure --prefix=$PREFIX --host=${HOST} \
CC=${CROSS}gcc \
CXX=${CROSS}g++
make
make install
- Build ví dụ
Trong thư mục xmlrpc-c-1.33.17/examples có ví dụ chạy chương trình tính tổng
xmlrpc_sample_add_client.c
xmlrpc_sample_add_server.c
Build chương trình client:
DEPEND_LIB_DIR=/path/to/xmlrpc/client/install
export CFLAGS="-I${DEPEND_LIB_DIR}/include -I${DEPEND_LIB_DIR}/include/xmlrpc-c"
export CPPFLAGS=${CFLAGS}
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
XMLRPC_C_CONFIG=xmlrpc-c-config
INCLUDES=$($XMLRPC_C_CONFIG client abyss-server cgi-server --cflags)
LIBS=$($XMLRPC_C_CONFIG client abyss-server cgi-server --libs)
gcc xmlrpc_sample_add_client.c ${CFLAGS} ${INCLUDES} ${LIBS}
Build chương trình server:
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
export CROSS=arm-none-linux-gnueabi-
export HOST=arm-none-linux-gnueabi
export CFLAGS="-I${DEPEND_LIB_DIR}/include -I${DEPEND_LIB_DIR}/include/xmlrpc-c"
export CPPFLAGS=${CFLAGS}
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
XMLRPC_C_CONFIG=xmlrpc-c-config
INCLUDES=$($XMLRPC_C_CONFIG client abyss-server cgi-server --cflags)
LIBS=$($XMLRPC_C_CONFIG client abyss-server cgi-server --libs)
arm-none-linux-gnueabi-gcc xmlrpc_sample_add_server.c ${CFLAGS} ${INCLUDES} ${LIBS}
- Copy toàn bộ thư viện và chương trình xmlrpc server xuống board
- Source biến môi trường và chạy chương trình server trên board
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
- Source biến môi trường và chạy chương trình client trên máy tính