Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xmlrpc-c适用于初学者,示例代码无效->;应为XMLRPC_类型_数组_C_Xml Rpc - Fatal编程技术网

xmlrpc-c适用于初学者,示例代码无效->;应为XMLRPC_类型_数组

xmlrpc-c适用于初学者,示例代码无效->;应为XMLRPC_类型_数组,c,xml-rpc,C,Xml Rpc,我通过以下基本代码在控制台上显示xml格式: #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

我通过以下基本代码在控制台上显示xml格式:

#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;
}
输出

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
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
提交数据->
sample.sumand差异
5.
7.
respon数据->
sample.sumand差异
参数>
应为XMLRPC_类型_数组
问题

  • 为什么这些代码不能正常工作
  • 什么是
    意思?如果xmlrpc服务器(任何基于xmlrpc的服务器,如xmlrpc-c、xmlrpc-java等)请求
    整数
    ,将
    表示它吗

  • thx for everything

    aah,在我查找xmlrpc-c库提供的函数之后,我找到了
    xmlrpc_serialize_response(),我认为它会做这样的事情

    #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;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #定义XMLRPC_名称“XML-RPC tesaja”
    #定义XMLRPC_版本“0.1”
    int main()
    {
    //申报
    xmlrpc_env env;
    xmlrpc_值*result=NULL;
    xmlrpc_client_init(xmlrpc_client_NO_标志、xmlrpc_名称、xmlrpc_版本);
    xmlrpc_env_init(&env);
    结果=xmlrpc_客户端_调用(&env)http://xmlrpc-c.sourceforge.net/api/sample.php" ,
    “sample.sumAndDifference”,“(ii)”,//方法
    (xmlrpc_int32)5,//var
    (xmlrpc_int32)3);//var
    /*ma代码*/
    字符输出[1024]={0};
    int l_输出=0;
    /*------------------keluarin xml------------------*/
    xmlrpc_值*参数;
    xmlrpc_mem_block*xmlmemblockP=NULL;
    参数=xmlrpc_build_value(&env,“(ii)”,(xmlrpc_int32)5,(xmlrpc_int32)7);
    xmlmemblockP=XMLRPC_MEMBLOCK_NEW(char和env,0);
    xmlrpc_序列化_调用(&env,xmlmemblockP,“sample.sumAndDifference”,params);
    l_output=snprintf(输出,XMLRPC_MEMBLOCK_大小(char,xmlmblockp),“%s”,XMLRPC_MEMBLOCK_内容(char,xmlmblockp));
    输出[l_输出]='\0';
    printf(“提交数据->\n%s\n”,输出);
    XMLRPC_MEMBLOCK_FREE(char,xmlmblockp);
    /*处理我们的参数数组*/
    xmlrpc_DECREF(参数);
    /*------------------keluarin xml------------------*/
    如果(发生环境故障)
    {
    printf(“错误:%s\n”,环境故障\u字符串);
    返回0;
    }
    //解析我们的结果值
    xmlrpc_int32和,差;
    xmlrpc_分解_值(&env,result,“{s:i,s:i,*}”,
    “总和”&总和,
    “差异”和“差异”;
    /*keluarinxml响应*/
    xmlmemblockP=XMLRPC_MEMBLOCK_NEW(char和env,0);
    xmlrpc_序列化_响应(&env、xmlmblockp、result);
    l_output=snprintf(输出,XMLRPC_MEMBLOCK_大小(char,xmlmblockp),“%s”,XMLRPC_MEMBLOCK_内容(char,xmlmblockp));
    输出[l_输出]='\0';
    printf(“响应数据->\n%s\n”,输出);
    XMLRPC_MEMBLOCK_FREE(char,xmlmblockp);
    /*keluarinxml响应*/
    如果(发生环境故障)
    {
    printf(“错误:%s\n”,环境故障\u字符串);
    返回0;
    }
    //打印出我们的总和和差额。
    printf(“和:%d,差:%d\n”,(int)和,(int)差);
    //处理我们的结果值。
    xmlrpc_DECREF(结果);
    //关闭我们的XML-RPC客户端库。
    xmlrpc_env_clean(&env);
    xmlrpc_client_cleanup();
    返回0;
    }
    
    输出

    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
    
    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
    
    提交数据->
    sample.sumand差异
    5.
    7.
    respon数据->
    总和
    8.
    差异
    2.
    /方法响应>
    和:8,差:2
    
    幸运的是它做到了。 现在,这是我完成的第一个问题。
    但第二个问题没有回答,有人介意回答左边的问题吗?

    好啦,卡佩德,i4和整数是一样的。它表示类型,在本例中对应于一个整数。 参考:

    最好的, 卢乔