原文地址:http://www.ibm.com/developerworks/cn/lotus/domino-php/index.html
PHP 有一些检索基于 Web 的内容的函数。这些函数一开始就包含于 PHP 中,但管理员有时可能不会激活它们。以下函数可检索 Web 文件:
file_get_contents()。此函数易于使用,支持 GET 和 POST 请求类型。使用 file_get_contents() 函数,可将整个 Web 文件作为字符串而一次性地获得它。
fopen()。此方法成块读取 Web 文件。
file()。此方法读取整个 Web 文件,并逐行分隔文件内容。此方法是 file_get_contents() 与 fopen() 的一种交叉。
fsockopen()。此函数最有可能在宿主 Web 服务器上被激活。此函数与其他函数的主要差异在于,使用 fsockopen() 时,您必须自行创建整个 Web 请求,而不能只设置几个不同的参数。
CURL。Client URL Library (CURL) 具有最高级的功能性。使用 CURL,您可以连接到使用多种不同协议的多种服务器。CURL 目前支持 HTTP、HTTPS、FTP、Gopher、Telnet、DICT、File 和 LDAP。它还支持代理、cookies 及身份验证。遗憾的是,Web 托管公司往往会禁用 CURL。
注意:本文的示例应用程序仅使用 file_get_contents() 函数。
获得 Domino 会话 cookie 是此流程的重要部分,您可将相同的代码用于其他与 Domino 相关的应用程序中。例如,您可以使用 STLinks 检索 cookie,以登录到 IBM Lotus Sametime 服务器。
通过向 Domino 服务器发送 POST 请求获取会话 cookie。在该请求中,需要将您的用户名和口令包含在内。服务器的响应包括一个 cookie,供您在后续向 Domino 服务器发送请求时使用。通过包含会话 cookie,Domino 服务器会将您的脚本视为最近登录过、现正访问数据库的实际人类用户。
之所以使用 POST 方法而不是 GET 方法,是因为 GET 方法的 URL 会被记录到 Domino 日志中,任何访问日志的用户都能看到您的用户名和口令 —— 而且是明文。使用 POST 方法,用户名和口令不被作为 URL 的一部分,因此也不会显示在常规日志中。
您可在 Set-Cookie 响应头中找到 Domino 会话 cookie。会话 cookie 名为 DomAuthSessId 或 LtpaToken。当 Domino 服务器配置为单点登录 (SSO) 时使用 LtpaToken 作为名称。实际上,您不必在意 cookie 的名称,只需保存整个 cookie 字符串即可。
以下代码示例展示了如何检索 cookie。
$req="username=john+doe&password=john123";
$opts = array(
"http"=>array(
"method"=>"POST",
"content" => $req,
"header"=>"Accept-language: enrn" .
"User-Agent: Mozilla/4.0 (compatible;
MSIE 6.0; Windows NT 5.1)rn"
)
);
$context = stream_context_create($opts);
if (!($fp = fopen("http://server.com/maildb.nsf?login",
"r", false, $context))) {
die("Could not open login URL");
}
$meta = stream_get_meta_data($fp);
for ($j = 0; isset($meta["wrapper_data"][$j]); $j++)
{
if (strstr(strtolower($meta["wrapper_data"][$j]), 'set-cookie'))
{
$cookie = substr($meta["wrapper_data"][$j],12);
break;
}
}
fclose($fp);
$_SESSION["DominoCookie"]=$cookie;
在代码行 $req="username=john+doe&password=john123" 中,您提供一个有效的用户名和口令,以登录到 Domino 服务器。随后设置附加选项,如 POST 方法类型和其他头。之后,将这些附加选项应用到外发 HTTP 请求:
fopen("http://server.com/mydb.nsf?login", "r", false, $context)
使用 stream_get_meta_data($fp) 函数从 Domino 服务器返回的响应中获取所有头,遍历直至找到包含 Set-Cookie 字符串的头。随后,将 cookie 存储在会话变量中来保存:
$_SESSION["DominoCookie"]=$cookie
$_SESSION 在您关闭 Web 浏览器之前一直保存 cookie 值。
现在,将 cookie 应用到您的下一个请求中,该请求从 Domino 邮件数据库中检索 Inbox 视图/文件夹。
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: enrn" .
“User-Agent: Mozilla/4.0 (compatible;
MSIE 6.0; Windows NT 5.1)rn" .
"Cookie: " . $_SESSION["DominoCookie"] . "rn"
)
);
$context = stream_context_create($opts);
$xml = file_get_contents(
"http://server.com/maildb.nsf/($Inbox)?ReadViewEntries",
false, $context);
这次使用了 GET 方法而不是 POST 方法来下载 Web 页面。该方法在 HTTP 选项数组中的 'method'=>"GET" 代码行中指定。使用 file_get_contents(URL, false, context) 函数读取整个响应,而不仅仅是读取头。此操作的结果是一个 XML 长字符串,它包含 Inbox 视图中的所有列。通过以下代码将会话 cookie 附在头上:
"Cookie: " . $_SESSION["DominoCookie"] . "rn"
获取 XML 数据后,就可以在 PHP XML 解析器中处理这些数据了。接下来将为 Inbox 视图创建您自己的用户界面。