PHP 日本會議 2024

xmlrpc_encode_request

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_encode_request為方法請求產生 XML

說明

xmlrpc_encode_request(字串 $method, 混合 $params, 陣列 $output_options = ?): 字串
警告

此函數為實驗性質。此函數的行為、名稱以及相關文件可能會在未來 PHP 版本中變更,恕不另行通知。請自行承擔使用此函數的風險。

參數

method

要呼叫的方法名稱。

params

與方法簽章相容的方法參數。

output_options

指定輸出選項的陣列,可能包含(預設值已強調):

  • output_type:php,xml

  • verbosity:no_white_space,newlines_only,pretty

  • escaping:cdata,non-ascii, non-print, markup(可以是包含單一值的字串或包含多個值的陣列)

  • version:simple,xmlrpc,soap 1.1,auto

  • encoding:iso-8859-1,其他 iconv 支援的字元集

回傳值

回傳一個包含請求的 XML 表示法的字串。

範例

範例 #1 XMLRPC 用戶端函數範例

<?php
$request
= xmlrpc_encode_request("method", array(1, 2, 3));
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => "Content-Type: text/xml",
'content' => $request
)));
$file = file_get_contents("http://www.example.com/xmlrpc", false, $context);
$response = xmlrpc_decode($file);
if (
$response && xmlrpc_is_fault($response)) {
trigger_error("xmlrpc: $response[faultString] ($response[faultCode])");
} else {
print_r($response);
}
?>

參見

新增註解

使用者貢獻的註解 9 條註解

7
kelly at seankelly dot biz
21 年前
二進位字串(使用 xmlrpc_set_type 設定)會像預期的那樣放入 <base64>...</base64> 區塊。但是,每隔 80 個字元,此函數就會插入 XML 實體 "&#10;",這是一個 Unicode 換行符號,似乎是要造成換行,這確實很愚蠢。

儘管它很愚蠢,但它確實對某些 XML-RPC 伺服器(例如 http://jakarta.apache.org/xmlrpc/(前身為 Helma))造成了實際問題。使用如下方式移除這些實體

$req = preg_replace('/&#10;/', '', xmlrpc_encode_request("my.method", $args));

可以解決這個問題。
3
fredrik at it dot cdon dot com
16 年前
應該注意的是,編碼似乎沒有編碼任何東西,只是指定 XML 標頭中放入什麼。

當使用此函數,將其傳送到 Apache XML-RPC Servlet 並儲存在 MySQL 資料庫中時,我們在將雙重編碼的 UTF 字串儲存到資料庫時遇到問題。透過將 'escaping' 設定為僅 'markup' 並將 'encoding' 設定為 'UTF-8' 解決了這個問題(別忘了在 xmlrpc_decode 中也設定 'utf-8')。

似乎 UTF-8 編碼的字串會將其位元組作為實體而不是字元作為實體轉義。
2
cometfish at hotmail dot com
16 年前
上面的範例不正確 - 標頭需要是一個陣列,請參閱「chris dot vigelius at gmx dot net」的貼文:http://au.php.net/manual/en/function.stream-context-create.php#74431
他的貼文也展示了如何執行瀏覽器驗證,如下所示
<?php
$request
= xmlrpc_encode_request("methodName", array("methodParam"));
$auth = base64_encode($username.":".$password);
$header = (version_compare(phpversion(), '5.2.8'))
? array(
"Content-Type: text/xml","Authorization: Basic $auth")
:
"Content-Type: text/xml\r\nAuthorization: Basic $auth" ; //[1]
$context = stream_context_create(array('http' => array(
'method' => "POST",
'header' => $header,
'content' => $request
)));
$webservice="http://www.example.com/rpc";
$file = file_get_contents($webservice, false, $context);
$response = xmlrpc_decode($file);
if (
xmlrpc_is_fault($response)) {
return
"xmlrpc: $response[faultString] ($response[faultCode])";
} else {
return
$response;
}
?>

1 - 編輯者註解:這是來自 "SandersWang dt php at gmail dot com" 的修正。
1
hfuecks at pinkgoblin dot com
22 年前
此函式應由 XML-RPC 用戶端使用,以建立 XML-RPC 請求的 XML 酬載;

<?php
$params
= "system.methodSignature";
$method = "system.methodHelp";
$request = xmlrpc_encode_request($method,$params);
echo (
$request );
?>

產生;

<?xml version='1.0' encoding="iso-8859-1" ?>
<methodCall>
<methodName>system.methodHelp</methodName>
<params>
<param>
<value>
<string>system.methodSignature</string>
</value>
</param>
</params>
</methodCall>

第二個引數會辨識變數的類型,並產生正確的 XML-RPC 結構。詳情請參閱 xmlrpc_encode()。
1
Anonymous
15 年前
有沒有試過使用 xmlrpc 傳輸像以下這樣的陣列?
$var1=array(7=>14,9=>18);

輸出的陣列看起來很不一樣!會像這樣
$var2=array(14,18);

我找到的唯一解決方案是在索引前面加上一個空格
$var3=array(' 7'=>14,' 9'=>18);

使用該方法,您將獲得正確的結果。($var1)
1
handco at gmail dot com
17 年前
使用函式 Overload 的簡單 OO 用戶端

php 方法 test_helloworld 會轉換為 xmlrpc 方法 test.helloworld。

class RpcClient {

private $_methods;
private $_context;
private $_url;

function __construct ($url, $user, $passwd) {
$auth = base64_encode(sprintf('%s:%s', $user,$passwd));
$this->_context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => "Content-Type: text/xml\r\n".
"Authorization: Basic $auth" ,

)
));
$this->_url = $url;

$this->registerMethod ("Test_HelloWorld");

}


function __call($methodName, $params) {
if (array_key_exists($methodName,$this->_methods)) {
// 呼叫 RPC 函式
$m = str_replace('_', '.', $methodName);
$r = xmlrpc_encode_request($m, $params,array('verbosity'=>'newlines_only'));
$c = $this->_context;
stream_context_set_option($c,'http','content',$r);
$f = file_get_contents($this->_url,false,$c);
$resp = xmlrpc_decode($f);
return $resp;
} else {
// 呼叫物件的函式
call_user_method_array($methodName, $this,$params);
}
}

private function registerMethod ($method) {
$this->_methods[$method] = true;
}

}
2
<URL:http://www.dlitz.net/go/contact/>
20 年前
請注意,據我所知,PHP 在 base64 欄位中產生的 &#10; 字元似乎完全沒有違反 XML-RPC 標準。XML-RPC 訊息*確實*採用 XML 格式,因此,XML 實體應在傳遞至 base64 解碼器之前進行解碼。因此,先前提到的基於 Jakarta 的 XML-RPC 伺服器似乎違反了 XML 規範。也就是說,PHP 中沒有任何地方需要「修正」。
1
php at hendrik dash krauss dot de
19 年前
如需陣列 output_options 的範例/文件,請參閱 http://xmlrpc-epi.sourceforge.net/main.php?t=php_api#output_options

簡而言之,output_options 可讓您傳送精簡的 xmlrpc(不包含 xmlrpc_encode 通常新增的所有「漂亮空白」)、在傳送之前套用自己的跳脫表格、設定編碼,以及其他一些事項(該頁面甚至有提到 soap 1.1 ... 我不清楚詳細資訊)。
0
giunta dot gaetano at sea-aeroportimilano dot it
18 年前
請注意,當使用特定參數呼叫此函式時,它會產生無效的 xmlrpc 內容(該內容本身可以被該程式庫順利解析,但其他實作方式則無法)。

xmlrpc_encode_request(null, null)
將產生一個沒有值的回應

xmlrpc_encode_request('myfunc', array('faultCode' => 666, 'faultString' => 'hello world')
將產生一個包含 <fault> 成員而不是 <params> 的請求
To Top