C/C++À» À§ÇÑ XML-RPC´Â xmlrpc-c À¥»çÀÌÆ® ¿¡¼ ±¸ÇÒ ¼ö ÀÖ´Ù.
°ü·Ã ÆÄÀϵéÀº RPM ÇüÅ·Π±¸ÇÒ ¼öµµ ÀÖ°í, ¼Ò½º¸¦ ³»·Á¹Þ¾Æ ÄÄÆÄÀÏÇÒ ¼öµµ ÀÖ´Ù.
´ÙÀ½ÀÇ Äڵ带 getSumAndDifference.cÀÇ À̸§À¸·Î ÀúÀåÇ϶ó:
#include <stdio.h> #include <xmlrpc.h> #include <xmlrpc_client.h> #define NAME "XML-RPC getSumAndDifference C Client" #define VERSION "0.1" #define SERVER_URL "http://xmlrpc-c.sourceforge.net/api/sample.php" void die_if_fault_occurred (xmlrpc_env *env) { /* Check our error-handling environment for an XML-RPC fault. */ if (env->fault_occurred) { fprintf(stderr, "XML-RPC Fault: %s (%d)\n", env->fault_string, env->fault_code); exit(1); } } int main (int argc, char** argv) { xmlrpc_env env; xmlrpc_value *result; xmlrpc_int32 sum, difference; /* Start up our XML-RPC client library. */ xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION); xmlrpc_env_init(&env); /* Call our XML-RPC server. */ result = xmlrpc_client_call(&env, SERVER_URL, "sample.sumAndDifference", "(ii)", (xmlrpc_int32) 5, (xmlrpc_int32) 3); die_if_fault_occurred(&env); /* Parse our result value. */ xmlrpc_parse_value(&env, result, "{s:i,s:i,*}", "sum", &sum, "difference", &difference); die_if_fault_occurred(&env); /* Print out our sum and difference. */ printf("Sum: %d, Difference: %d\n", (int) sum, (int) difference); /* Dispose of our result value. */ xmlrpc_DECREF(result); /* Shutdown our XML-RPC client library. */ xmlrpc_env_clean(&env); xmlrpc_client_cleanup(); return 0; } |
ÄÄÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù:
bash$ CLIENT_CFLAGS=`xmlrpc-c-config libwww-client --cflags` bash$ CLIENT_LIBS=`xmlrpc-c-config libwww-client --libs` bash$ gcc $CLIENT_CFLAGS -o getSumAndDifference getSumAndDifference.c $CLIENT_LIBS |
°¢ÀÚÀÇ ½Ã½ºÅÛ¿¡ ¸Âµµ·Ï À§ÀÇ gcc¸¦ ¹Ù²ãÁÖ¸é µÈ´Ù.
´ÙÀ½ÀÇ Äڵ带 getSumAndDifference2.ccÀÇ À̸§À¸·Î ÀúÀåÇ϶ó:
#include <iostream.h> #include <XmlRpcCpp.h> #define NAME "XML-RPC getSumAndDifference C++ Client" #define VERSION "0.1" #define SERVER_URL "http://xmlrpc-c.sourceforge.net/api/sample.php" static void get_sum_and_difference () { // Build our parameter array. XmlRpcValue param_array = XmlRpcValue::makeArray(); param_array.arrayAppendItem(XmlRpcValue::makeInt(5)); param_array.arrayAppendItem(XmlRpcValue::makeInt(3)); // Create an object to resprent the server, and make our call. XmlRpcClient server (SERVER_URL); XmlRpcValue result = server.call("sample.sumAndDifference", param_array); // Extract the sum and difference from our struct. XmlRpcValue::int32 sum = result.structGetValue("sum").getInt(); XmlRpcValue::int32 diff = result.structGetValue("difference").getInt(); cout << "Sum: " << sum << ", Difference: " << diff << endl; } int main (int argc, char **argv) { // Start up our client library. XmlRpcClient::Initialize(NAME, VERSION); // Call our client routine, and watch out for faults. try { get_sum_and_difference(); } catch (XmlRpcFault& fault) { cerr << argv[0] << ": XML-RPC fault #" << fault.getFaultCode() << ": " << fault.getFaultString() << endl; XmlRpcClient::Terminate(); exit(1); } // Shut down our client library. XmlRpcClient::Terminate(); return 0; } |
ÄÄÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù:
bash$ CLIENT_CFLAGS=`xmlrpc-c-config c++ libwww-client --cflags` bash$ CLIENT_LIBS=`xmlrpc-c-config c++ libwww-client --libs` bash$ c++ $CLIENT_CFLAGS -o getSumAndDifference2 getSumAndDifference2.cc $CLIENT_LIBS |
±¸½Ä C++ ÄÄÆÄÀÏ·¯·Î´Â Á¦´ë·Î ÄÄÆÄÀÏÀÌ µÇÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù.
¸¸¾à XML-RPC ¼¹ö°¡ Introspection API¸¦ Áö¿øÇÑ´Ù¸é ÀÚµ¿À¸·Î C++ proxy class¸¦ ¸¸µé ¼ö ÀÖ´Ù. Proxy class¸¦ ¸¸µé±â À§Çؼ´Â ´ÙÀ½ÀÇ ¸í·ÉÀ» ÀÔ·ÂÇÏ°í ±× °á°ú¸¦ ÆÄÀÏ·Î ÀúÀåÇ϶ó:
bash$ xml-rpc-api2cpp \ > http://xmlrpc-c.sourceforge.net/api/sample.php sample SampleProxy |
À§ÀÇ ¸í·ÉÀº SampleProxy¶ó´Â À̸§ÀÇ proxy class¸¦ ¸¸µç´Ù. SampleProxy´Â sample·Î ½ÃÀÛÇÏ´Â ¸ðµç ¸Þ½îµåÀÇ ·¡ÆÛ(wrapper)¸¦ °¡Áö°í ÀÖ´Ù. ¹°·Ð ¿øÇÑ´Ù¸é ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.
´ÙÀ½ÀÇ Äڵ带 sumAndDifference.cÀÇ À̸§À¸·Î ÀúÀåÇ϶ó:
#include <xmlrpc.h> #include <xmlrpc_cgi.h> xmlrpc_value * sumAndDifference (xmlrpc_env *env, xmlrpc_value *param_array, void *user_data) { xmlrpc_int32 x, y; /* Parse our argument array. */ xmlrpc_parse_value(env, param_array, "(ii)", &x, &y); if (env->fault_occurred) return NULL; /* Return our result. */ return xmlrpc_build_value(env, "{s:i,s:i}", "sum", x + y, "difference", x - y); } int main (int argc, char **argv) { /* Set up our CGI library. */ xmlrpc_cgi_init(XMLRPC_CGI_NO_FLAGS); /* Install our only method (with a method signature and a help string). */ xmlrpc_cgi_add_method_w_doc("sample.sumAndDifference", &sumAndDifference, NULL, "S:ii", "Add and subtract two integers."); /* Call the appropriate method. */ xmlrpc_cgi_process_call(); /* Clean up our CGI library. */ xmlrpc_cgi_cleanup(); } |
ÄÄÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù:
bash$ CGI_CFLAGS=`xmlrpc-c-config cgi-server --cflags` bash$ CGI_LIBS=`xmlrpc-c-config cgi-server --libs` bash$ gcc $CGI_CFLAGS -o sumAndDifference.cgi sumAndDifference.c $CGI_LIBS |
ÄÄÆÄÀÏÀÌ µÇ¾úÀ¸¸é sumAndDifference.cgi ÆÄÀÏÀ» À¥¼¹öÀÇ cgi-bin µð·ºÅ丮¿¡ º¹»çÇÏ¸é µÈ´Ù.