API添加位置标题和302

时间:2018-03-12 01:57:43

标签: php xml api

我使用简单但相当长的查询字符串请求编写了一个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文件,因为需要首先处理传入的数据。因此,我试图围绕客户需要而不重复第二个文件中的处理。并且,因为我在黑暗中,无论如何,重定向可能不是问题。

1 个答案:

答案 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;只关注以所需格式渲染输出。