简体   繁体   中英

xmlrpc-c for beginner, sample code not work -> Expected XMLRPC_TYPE_ARRAY

i inteded to show xml format on the console from following basic code :

#include <stdio.h>
#include <stdlib.h>
#include <xmlrpc.h>
#include <xmlrpc_client.h>
#include <xmlrpc-c/base.h>
#include <xmlrpc-c/util.h>

#define XMLRPC_NAME       "XML-RPC tesaja"
#define XMLRPC_VERSION    "0.1"

int main()
{
//declare
    xmlrpc_env env;
    xmlrpc_value *result = NULL;

    xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, XMLRPC_NAME, XMLRPC_VERSION);
    xmlrpc_env_init(&env);


     result = xmlrpc_client_call(&env, "http://xmlrpc-c.sourceforge.net/api/sample.php" ,
                                 "sample.sumAndDifference", "(ii)", //method
                                (xmlrpc_int32) 5,                  //var
                                (xmlrpc_int32) 3);                 //var

    /* ma code */
     char output[1024] = {0};
     int l_output = 0;
    /* ------------------ keluarin xml ------------------*/
        xmlrpc_value *params;
        xmlrpc_mem_block *xmlmemblockP = NULL;

    params = xmlrpc_build_value(&env, "(ii)", (xmlrpc_int32) 5, (xmlrpc_int32) 7);    
    xmlmemblockP = XMLRPC_MEMBLOCK_NEW(char, &env, 0);
    xmlrpc_serialize_call(&env, xmlmemblockP, "sample.sumAndDifference", params);


    l_output = snprintf(output,XMLRPC_MEMBLOCK_SIZE(char, xmlmemblockP),"%s",XMLRPC_MEMBLOCK_CONTENTS(char, xmlmemblockP));
    output[l_output] = '\0';

    printf("submit data -> \n %s\n",output);

    XMLRPC_MEMBLOCK_FREE(char, xmlmemblockP);

    /* Dispose of our parameter array. */
    xmlrpc_DECREF(params);

     /* ------------------ keluarin xml ------------------*/


    if(env.fault_occurred)
    {
    printf("%s\n",env.fault_string);
        return 0;
    }


    // Parse our result value 
    xmlrpc_int32 sum, difference;
    xmlrpc_decompose_value(&env, result, "{s:i,s:i,*}",
                       "sum", &sum,
                       "difference", &difference);

    /* keluarin xml respon */
    params = result;
    xmlmemblockP = XMLRPC_MEMBLOCK_NEW(char, &env, 0);
    xmlrpc_serialize_call(&env, xmlmemblockP, "sample.sumAndDifference", params);

    l_output = snprintf(output,XMLRPC_MEMBLOCK_SIZE(char, xmlmemblockP),"%s",XMLRPC_MEMBLOCK_CONTENTS(char, xmlmemblockP));
    output[l_output] = '\0';    
    printf("respon data-> \n %s \n",output);
    XMLRPC_MEMBLOCK_FREE(char, xmlmemblockP);

    /* Dispose of our parameter array. */
    //xmlrpc_DECREF(params); //udah diwakilin dibawah
    /* keluarin xml respon*/


    if(env.fault_occurred)
    {
        printf("%s\n",env.fault_string);
        return 0;
    }


    // 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;
}

and somehow it doesnt work properly :

compile

$ gcc -o xxx xxx.c `xmlrpc-c-config libwww-client --libs --cflags`

output

submit data -> 
 <?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>sample.sumAndDifference</methodName>
<params>
<param><value><i4>5</i4></value></param>
<param><value><i4>7</i4></value></param>
</params>
</methodCall>
respon data-> 
 <?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>sample.sumAndDifference</methodName>
 params>
Expected XMLRPC_TYPE_ARRAY

question

  1. why these code could not work properly ?
  2. what is <i4> mean ?, if xmlrpc server (any xmlrpc based, like xmlrpc-c, xmlrpc java, etc..) asking for integer , will <i4> representing it ?

thx for everything

aah, after i sought the functions provided by xmlrpc-c library, i found xmlrpc_serialize_response(); , which i thought will do such thing

#include <stdio.h>
#include <stdlib.h>
#include <xmlrpc.h>
#include <xmlrpc_client.h>
#include <xmlrpc-c/base.h>
#include <xmlrpc-c/util.h>

#define XMLRPC_NAME       "XML-RPC tesaja"
#define XMLRPC_VERSION    "0.1"

int main()
{
//declare
    xmlrpc_env env;
    xmlrpc_value *result = NULL;

    xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, XMLRPC_NAME, XMLRPC_VERSION);
    xmlrpc_env_init(&env);


     result = xmlrpc_client_call(&env, "http://xmlrpc-c.sourceforge.net/api/sample.php" ,
                                 "sample.sumAndDifference", "(ii)", //method
                                (xmlrpc_int32) 5,                  //var
                                (xmlrpc_int32) 3);                 //var

    /* ma code */
     char output[1024] = {0};
     int l_output = 0;
    /* ------------------ keluarin xml ------------------*/
        xmlrpc_value *params;
        xmlrpc_mem_block *xmlmemblockP = NULL;

    params = xmlrpc_build_value(&env, "(ii)", (xmlrpc_int32) 5, (xmlrpc_int32) 7);    
    xmlmemblockP = XMLRPC_MEMBLOCK_NEW(char, &env, 0);
    xmlrpc_serialize_call(&env, xmlmemblockP, "sample.sumAndDifference", params);


    l_output = snprintf(output,XMLRPC_MEMBLOCK_SIZE(char, xmlmemblockP),"%s",XMLRPC_MEMBLOCK_CONTENTS(char, xmlmemblockP));
    output[l_output] = '\0';

    printf("submit data -> \n %s\n",output);

    XMLRPC_MEMBLOCK_FREE(char, xmlmemblockP);

    /* Dispose of our parameter array. */
    xmlrpc_DECREF(params);

     /* ------------------ keluarin xml ------------------*/


    if(env.fault_occurred)
    {
    printf("err : %s\n",env.fault_string);
        return 0;
    }


    // Parse our result value 
    xmlrpc_int32 sum, difference;

    xmlrpc_decompose_value(&env, result, "{s:i,s:i,*}",
                       "sum", &sum,
                       "difference", &difference);

    /* keluarin xml respon */

    xmlmemblockP = XMLRPC_MEMBLOCK_NEW(char, &env, 0);

    xmlrpc_serialize_response(&env,xmlmemblockP,result);    
    l_output = snprintf(output,XMLRPC_MEMBLOCK_SIZE(char, xmlmemblockP),"%s",XMLRPC_MEMBLOCK_CONTENTS(char, xmlmemblockP));
    output[l_output] = '\0';    
    printf("respon data-> \n %s \n",output);
    XMLRPC_MEMBLOCK_FREE(char, xmlmemblockP);

    /* keluarin xml respon*/


    if(env.fault_occurred)
    {
        printf("err : %s\n",env.fault_string);
        return 0;
    }


    // 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;
}

output

submit data -> 
 <?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>sample.sumAndDifference</methodName>
<params>
<param><value><i4>5</i4></value></param>
<param><value><i4>7</i4></value></param>
</params>
</methodCall>
respon data-> 
 <?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param><value><struct>
<member><name>sum</name>
<value><i4>8</i4></value></member>
<member><name>difference</name>
<value><i4>2</i4></value></member>
</struct></value></param>
</params>
 /methodResponse>
Sum: 8, Difference: 2

and fortunately it did. now thats first question done with. but second question left unanswered, anyone mind to answer the left?

Well capede, i4 is the same as integer. It represent the type, in this case corresponding to an integer. reference: http://www.tutorialspoint.com/xml-rpc/xml_rpc_data_model.htm

Bests, Lucho.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM