[英]xmlrpc-c for beginner, sample code not work -> Expected XMLRPC_TYPE_ARRAY
我從下面的基本代碼着手在控制台上顯示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;
}
並以某種方式無法正常工作:
編譯
$ gcc -o xxx xxx.c `xmlrpc-c-config libwww-client --libs --cflags`
輸出
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
題
<i4>
是什么意思?如果xmlrpc服務器(任何基於xmlrpc的文件,例如xmlrpc-c,xmlrpc java等)要求integer
,則<i4>
表示它嗎? 一切都感謝
啊,在我尋求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;
}
輸出
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
幸運的是它做到了。 現在,多數民眾贊成在第一個問題完成。 但是第二個問題沒有答案,有人願意回答嗎?
好斗篷,i4與整數相同。 它表示類型,在這種情況下,它對應於整數。 參考: http : //www.tutorialspoint.com/xml-rpc/xml_rpc_data_model.htm
最好的,盧喬。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.