我正在为一个基于 PHP/MySQL 的网站使用 xmlrpc-epi 的网络服务,我得到如下 xmlrpc 客户端响应:
opening socket to host: comingsoon.com, port: 80, uri: /CM_server.php
sending http request:
POST /CM_server.php HTTP/1.0
User-Agent: xmlrpc-epi-php/0.2 (PHP)
Host: fn24dev.com:80 Content-Type: text/xml
Content-Length: 117
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>listVideos</methodName>
<params/>
</methodCall>
receiving response...
got response:
<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
<param>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>0</name>
<value>
<string>63</string>
</value>
</member>
<member>
<name>indexer</name>
<value>
<string>63</string>
</value>
</member>
<member>
<name>1</name>
<value>
<string>02_CHIMPPANTS_24-03-2012_04-43-06</string>
</value>
</member>
<member>
<name>video_id</name>
<value>
<string>02_CHIMPPANTS_24-03-2012_04-43-06</string>
</value>
</member>
<member>
<name>2</name>
<value>
<string>mp4</string>
</value> </member>
<member>
<name>type</name>
<value>
<string>mp4</string>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</param>
</params>
</methodResponse>
在此,我将 mysql 表字段名和字段值都作为 xml 文本内容获取。但我想得到像 mysql 字段名作为元素和字段值作为文本内容的响应。如下所示,
<member>
<indexer>63</indexer>
</member>
<member>
<video_id>02_CHIMPPANTS_24-03-2012_04-43-06</video_id>
</member>
<member>
<type>mp4</type>
</member>
我添加了 PHP 代码和 mysql 表和数据以进行说明。
Table_name: videos
indexer video_id type
-------- ---------------------------------- -----
63 02_CHIMPPANTS_24-03-2012_04-43-06 mp4
54 02_Friday_23-03-2012_05-11-18 mp4
CM_server.php
<?php
function Connect(){
$connect = mysql_connect("localhost","root","");
$db = mysql_select_db("database") or die("Database is not valid");
}
//Get the Videos
function getVideos(){
//connect database
Connect();
$videoquery = mysql_query("select * from videos");
if(mysql_num_rows($videoquery) == "0"){
$returnquery = "0";
} else {
while($getquery = mysql_fetch_array($videoquery)){
$returnquery[] = $getquery;
}
}
return $returnquery;
}
//server creating and check a list a method
$request = $HTTP_RAW_POST_DATA;
if (!$request) $request_xml = $HTTP_POST_VARS['xml'];
$server = xmlrpc_server_create( );
if (!$server) die("Couldn't create server");
xmlrpc_server_register_method($server, 'listVideos', 'getVideos');
$options = array('output_type' => 'xml', 'version' => 'auto');
echo xmlrpc_server_call_method($server, $request, null, $options);
xmlrpc_server_destroy($server);
?>
client.php
<?php
include("utils.php");
$options = array('output_type' => 'xml', 'version' => 'xmlrpc');
$result1 = xu_rpc_http_concise(array(method => 'listVideos',host => 'comingsoon.com',uri=> '/CM_server.php',options => $options,debug => 1));
?>
utils.php
<?php
xu_load_extension();
// a function to ensure the xmlrpc extension is loaded.
// xmlrpc_epi_dir = directory where libxmlrpc.so.0 is located
// xmlrpc_php_dir = directory where xmlrpc-epi-php.so is located
function xu_load_extension($xmlrpc_php_dir="") {
if(!extension_loaded('xmlrpc')) {
$bSuccess = true;
putenv("LD_LIBRARY_PATH=/usr/lib/php4/apache/xmlrpc/");
if ($xmlrpc_php_dir) {
$xmlrpc_php_dir .= '/';
}
if (!extension_loaded("xmlrpc")) {
$bSuccess = dl($xmlrpc_php_dir . "xmlrpc-epi-php.so");
}
}
return $bSuccess;
}
/* generic function to call an http server with post method */
function xu_query_http_post($request, $host, $uri, $port, $debug,
$timeout, $user, $pass, $secure=false) {
$response_buf = "";
if ($host && $uri && $port) {
$content_len = strlen($request);
$fsockopen = $secure ? "fsockopen_ssl" : "fsockopen";
dbg1("opening socket to host: $host, port: $port, uri: $uri", $debug);
$query_fd = $fsockopen($host, $port, $errno, $errstr, 10);
if ($query_fd) {
$auth = "";
if ($user) {
$auth = "Authorization: Basic " .
base64_encode($user . ":" . $pass) . "\r\n";
}
$http_request =
"POST $uri HTTP/1.0\r\n" .
"User-Agent: xmlrpc-epi-php/0.2 (PHP)\r\n" .
"Host: $host:$port\r\n" .
$auth .
"Content-Type: text/xml\r\n" .
"Content-Length: $content_len\r\n" .
"\r\n" .
$request;
dbg1("sending http request:</h3> <xmp>\n$http_request\n</xmp>", $debug);
fputs($query_fd, $http_request, strlen($http_request));
dbg1("receiving response...", $debug);
$header_parsed = false;
$line = fgets($query_fd, 4096);
while ($line) {
if (!$header_parsed) {
if ($line === "\r\n" || $line === "\n") {
$header_parsed = 1;
}
dbg2("got header - $line", $debug);
}
else {
$response_buf .= $line;
}
$line = fgets($query_fd, 4096);
}
fclose($query_fd);
}
else {
dbg1("socket open failed", $debug);
}
}
else {
dbg1("missing param(s)", $debug);
}
dbg1("got response:</h3>. <xmp>\n$response_buf\n</xmp>\n", $debug);
return $response_buf;
}
function xu_fault_code($code, $string) {
return array('faultCode' => $code,
'faultString' => $string);
}
function find_and_decode_xml($buf, $debug) {
if (strlen($buf)) {
$xml_begin = substr($buf, strpos($buf, "<?xml"));
if (strlen($xml_begin)) {
$retval = xmlrpc_decode($xml_begin);
}
else {
dbg1("xml start token not found", $debug);
}
}
else {
dbg1("no data", $debug);
}
return $retval;
}
function xu_rpc_http_concise($params) {
$host = $uri = $port = $method = $args = $debug = null;
$timeout = $user = $pass = $secure = $debug = null;
extract($params);
// default values
if(!$port) {
$port = 80;
}
if(!$uri) {
$uri = '/';
}
if(!$output) {
$output = array(version => 'xmlrpc');
}
$response_buf = "";
if ($host && $uri && $port) {
$request_xml = xmlrpc_encode_request($method, $args, $output);
$response_buf = xu_query_http_post($request_xml, $host, $uri, $port, $debug,
$timeout, $user, $pass, $secure);
$retval = find_and_decode_xml($response_buf, $debug);
}
return $retval;
}
/* call an xmlrpc method on a remote http server. legacy support. */
function xu_rpc_http($method, $args, $host, $uri="/", $port=80, $debug=false,
$timeout=0, $user=false, $pass=false, $secure=false) {
return xu_rpc_http_concise(
array(
method => $method,
args => $args,
host => $host,
uri => $uri,
port => $port,
debug => $debug,
timeout => $timeout,
user => $user,
pass => $pass,
secure => $secure
));
}
function xu_is_fault($arg) {
// xmlrpc extension finally supports this.
return is_array($arg) ? xmlrpc_is_fault($arg) : false;
}
/* sets some http headers and prints xml */
function xu_server_send_http_response($xml) {
header("Content-type: text/xml");
header("Content-length: " . strlen($xml) );
echo $xml;
}
function dbg($msg) {
echo "<h3>$msg</h3>"; flush();
}
function dbg1($msg, $debug_level) {
if ($debug_level >= 1) {
dbg($msg);
}
}
function dbg2($msg, $debug_level) {
if ($debug_level >= 2) {
dbg($msg);
}
}
?>
如果有人知道 xmlrpc 来获得这个解决方案,请指导我。
最佳答案
您要求的结构不是 XML-RPC,因此您将无法使用 PHP 的 XML-RPC 扩展来实现它。 XML-RPC Specification为响应定义精确的结构,包括可用的类型。
您心目中的 XML 服务只需要一个 XML 解析库(例如 SimpleXML)、一些 XML 创建函数(可以是将 PHP 数组转换为 XML 格式字符串的递归函数)和少量的“调度代码”以支持一个 URL 上的不同方法:
$request_xml = file_get_contents('php://input');
$request_sx = simplexml_load_string($request_xml);
switch ( (string)$request_sx->Method )
{
case 'listVideos':
$data = getVideos( (string)$request_sx->Params->SearchTerm );
$response_xml = generate_xml($data);
break;
}
header('Content-Type: text/xml');
echo $response_xml;
exit;
关于php - 如何从 mysql 数据库获取 xmlrpc 响应,如字段名称作为元素和记录作为数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10361781/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为