我使用简单但相当长的查询字符串请求编写了一个API。 请求者可以指定XML或HTML响应。
接收查询并处理数据。 HTML简单地回应了一个回复。为了避免冗余代码,我使用JavaScript重定向来打开和处理XML。看起来像这样:
$QString = '';
foreach($XMLItems as $key => $value)
{
$QString .= $key.'^'.$value.'|';
}
$QString = substr($QString,0,-1);
Redirect('XMLProcess.php?Q='.$QString);
Redirect()是一个运行javascript的简单函数:
function Redirect($n)
{
die("<script type=\"text/javascript\">window.location='$n';</script>");
}
XML构造如下所示:
<?php
$dom = new DOMDocument("1.0");
header ("Content-Type:text/xml");
$QArray = explode('|',$_REQUEST[Q]);
foreach($QArray as $value)
{
$x = explode('^',$value);
$XMLItems[$x[0]] = $x[1];
}
$root = $dom->createElement("Data");
$dom->appendChild($root);
foreach($XMLItems as $key => $value)
{
$key = $dom->createElement($key);
$root->appendChild($key);
$variable = $dom->createTextNode($value);
$key->appendChild($variable);
}
echo $dom->saveXML();
?>
就API而言,我非常无知,有人可能在接收端使用了什么。我有一个客户端要求302重定向和位置标头。我假设我的Redirect()函数可能会抛弃他的软件,但我真的不知道。当然,我无法立即重定向到XML文件,因为需要首先处理传入的数据。因此,我试图围绕客户需要而不重复第二个文件中的处理。并且,因为我在黑暗中,无论如何,重定向可能不是问题。
答案 0 :(得分:1)
要发出302重定向(或任何状态代码),您需要使用header
。根据文档:
第二个特例是&#34;位置:&#34;头。它不仅将此标头发送回浏览器,而且还向浏览器返回REDIRECT(302)状态代码,除非已经设置了201或3xx状态代码。
将实现如下:
function Redirect($n)
{
header("Location: $n");
exit(0);
}
如评论中所述,由于您的脚本在调用Redirect
之前发出输出,因此您需要使用ob_start
(和朋友)来捕获该输出并将其发出标题发送后:
ob_start();
// ...
$QString = '';
foreach($XMLItems as $key => $value)
{
$QString .= $key.'^'.$value.'|';
}
$QString = substr($QString,0,-1);
Redirect('XMLProcess.php?Q='.$QString);
function Redirect($n)
{
header("Location: $n");
$contents = ob_get_clean();
// echo $contents; // if you want or need to
// you might also consider leaving this, but clients will
// honor the 302 before executing any Javascript
die("<script type=\"text/javascript\">window.location='$n';</script>");
}
所有这些都说,但代码感觉非常笨拙。如果可能的话,考虑重构HTML和XML版本,以便代码的主要工作在包含的帮助器中完成,并且HTML和XML&#34;前端&#34;只关注以所需格式渲染输出。