The example above is incorrect - the header needs to be an array, see post by "chris dot vigelius at gmx dot net": http://au.php.net/manual/en/function.stream-context-create.php#74431
His post also shows how to do browser authentication, as below:
<?php
$request = xmlrpc_encode_request("methodName", array("methodParam"));
$auth = base64_encode($username.":".$password);
$header = array("Content-Type: text/xml","Authorization: Basic $auth");
$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;
}
?>
xmlrpc_encode_request
(PHP 4 >= 4.0.7, PHP 5)
xmlrpc_encode_request — メソッドリクエスト用の XML を生成する
説明
警告
この関数は、 実験的 なものです。この関数の動作・ 名前・その他ドキュメントに書かれている事項は、予告なく、将来的な 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 (xmlrpc_is_fault($response)) {
trigger_error("xmlrpc: $response[faultString] ($response[faultCode])");
} else {
print_r($response);
}
?>
xmlrpc_encode_request
cometfish at hotmail dot com
01-Sep-2008 04:47
01-Sep-2008 04:47
fredrik at it dot cdon dot com
06-Feb-2008 10:05
06-Feb-2008 10:05
It should be noted that encoding does not seem to encode anything, just specify what goes into the XML header.
We had problems with double-encoded UTF strings being saved to database when using this function, sending it of to a apache xml-rpc servlet and storing it in mysql database. It was solved by setting 'escaping' to just 'markup' and 'encoding' to 'UTF-8' (don't forget to set 'utf-8' in xmlrpc_decode too).
It seems that UTF-8 encoded strings gets escaped with their bytes as entities instead of their characters as entites.
handco at gmail dot com
13-Mar-2007 01:39
13-Mar-2007 01:39
Simple OO client with function Overload :
the php metho test_helloworld is translated to xmlrpc method 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)) {
// on appelle la fonction 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 {
// on appelle la fonction de l'objet
call_user_method_array($methodName, $this,$params);
}
}
private function registerMethod ($method) {
$this->_methods[$method] = true;
}
}
giunta dot gaetano at sea-aeroportimilano dot it
21-Aug-2006 07:54
21-Aug-2006 07:54
Take care that this function will generate invalid xmlrpc content when invoked with certain parameters (said content will be happily parsed by the lib itself, but not by other implementations).
xmlrpc_encode_request(null, null)
will generate a response without a value
xmlrpc_encode_request('myfunc', array('faultCode' => 666, 'faultString' => 'hello world')
will generated a request containing a <fault> member instead of <params>
php at hendrik dash krauss dot de
28-May-2005 06:29
28-May-2005 06:29
For examples / documentation of the array output_options, see http://xmlrpc-epi.sourceforge.net/main.php?t=php_api#output_options
In short, output_options lets you send compact xmlrpc (without all the "pretty whitespace" xmlrpc_encode adds normally), apply an own escaping table prior to sending, set the encoding, and a couple of other things (the page even says something about soap 1.1 ... I don't know details).
<URL:http://www.dlitz.net/go/contact/>
04-May-2004 03:28
04-May-2004 03:28
Note that as far as I can tell, the characters generated by PHP in the base64 fields don't appear to violate the XML-RPC standard at all. XML-RPC messages *are* in XML format, and as such, the XML entities should be getting decoded before being passed to a base64 decoder. So, the previously-mentioned Jakarta-based XML-RPC server appears to violate the XML spec. i.e. There's nothing here that needs to be "fixed" in PHP.
kelly at seankelly dot biz
29-Dec-2002 09:02
29-Dec-2002 09:02
Binary strings (set with xmlrpc_set_type) go into a <base64>...</base64> block like you'd expect. But after every 80th character, this function inserts the XML entity " ", which is a Unicode newline, as if to cause a line-wrap, which is admittedly silly.
Silly though it may be, it causes real problems for some XML-RPC servers, such as http://jakarta.apache.org/xmlrpc/ (nee Helma). Stripping out those entities with something like
$req = preg_replace('/ /', '', xmlrpc_encode_request("my.method", $args));
works around the problem.
hfuecks at pinkgoblin dot com
16-Aug-2002 01:06
16-Aug-2002 01:06
This function should be used by an XML-RPC client to create an XML payload for an XML-RPC request;
<?php
$params = "system.methodSignature";
$method = "system.methodHelp";
$request = xmlrpc_encode_request($method,$params);
echo ( $request );
?>
Produces;
<?xml version='1.0' encoding="iso-8859-1" ?>
<methodCall>
<methodName>system.methodHelp</methodName>
<params>
<param>
<value>
<string>system.methodSignature</string>
</value>
</param>
</params>
</methodCall>
The second argument recognises the type of variable and generates the correct XML-RPC structure. See xmlrpc_encode() for more details.
