如何在PHP中捕获未设置的请求值
我真的不确定这是否可能,但我们有一个问题,我们控制一个接口,该接口通过HTTP post将XML以如何在PHP中捕获未设置的请求值,php,xml,post,Php,Xml,Post,我真的不确定这是否可能,但我们有一个问题,我们控制一个接口,该接口通过HTTP post将XML以www.url.com/script.php?XML=的形式发布到它。然后对URL进行编码并传递给我们,然后我们对其进行解码和解析 除了我有一个客户机拒绝url编码他们的传入代码,这很好,除非XML碰到了一个符号AND,此时所有内容都被解析为XML变量的结尾 www.url.com/script.php?xml= 最终的结果是,我让XML像正常情况一样POST/GET到XML变量中,然后由于符号an
www.url.com/script.php?XML=
的形式发布到它。然后对URL进行编码并传递给我们,然后我们对其进行解码和解析
除了我有一个客户机拒绝url编码他们的传入代码,这很好,除非XML碰到了一个符号AND,此时所有内容都被解析为XML变量的结尾
www.url.com/script.php?xml=
最终的结果是,我让XML像正常情况一样POST/GET到XML变量中,然后由于符号and,我丢失了一半的传入内容
现在我知道这是预期的/正确的行为,我的问题是,是否有可能捕获此代码的&bar…/>
段,这样,如果我们遇到已知错误,我就可以撬开它以使其正常工作?我知道这是不理想的,但我在与外界打交道时束手无策
更新
好吧,所以我完全糊涂了。在获取了下面提到的服务器变量之后,看起来我没有得到querystring,但这是因为在他们提交的查询中有:
[CONTENT_TYPE] => application/x-www-form-urlencoded
[QUERY_STRING] =>
既然如此,上述行为是否仍在意料之中?在这种情况下,它们是获取原始表单输入的一种方法吗?感谢以下海报的帮助这里的问题是,查询字符串将被解析为&和=个字符。如果知道=字符在“bar”键之后的位置,则可以捕获字符串其余部分的值。然而,如果你点击更多,你将需要知道传入消息正文的全部内容。如果您这样做,那么您应该能够获得其余的内容。这里的问题是查询字符串将被解析为&和=个字符。如果知道=字符在“bar”键之后的位置,则可以捕获字符串其余部分的值。然而,如果你点击更多,你将需要知道传入消息正文的全部内容。如果您这样做了,那么您应该能够获取其余的内容。如果可能的话,您将很难做到这一点,因为查询字符串的片段采用foo=bar格式,以&字符作为分隔符。这意味着您将创建一个不可预测的$\u get变量,该变量将使用&和next=(假设存在)之间所有内容的键名,该键名将值从=带到下一个&或字符串末尾 也许可以尝试以某种方式解析$\u GET数组以恢复丢失的含义,但它永远不会那么可靠。您可能会更幸运地尝试解析$\u SERVER['QUERY\u STRING'],但这也不能保证成功,而且对于一个仅通过客户端正确使用API就可以避免的问题来说,这将是一个巨大的努力
对我来说,这是重点。如果你的客户拒绝按照你告诉他们的方式使用你的API,那么如果API不起作用,那最终是他们的问题,而不是你的问题。当然,你应该让你的客户达到一个合理的标准,但这并不意味着仅仅因为他们拒绝满足你的需求或为每个人的利益而制定的技术标准,就要为他们竭尽全力 如果可能的话,您将很难做到这一点,因为查询字符串的片段采用foo=bar格式,以&字符作为分隔符。这意味着您将创建一个不可预测的$\u get变量,该变量将使用&和next=(假设存在)之间所有内容的键名,该键名将值从=带到下一个&或字符串末尾 也许可以尝试以某种方式解析$\u GET数组以恢复丢失的含义,但它永远不会那么可靠。您可能会更幸运地尝试解析$\u SERVER['QUERY\u STRING'],但这也不能保证成功,而且对于一个仅通过客户端正确使用API就可以避免的问题来说,这将是一个巨大的努力
对我来说,这是重点。如果你的客户拒绝按照你告诉他们的方式使用你的API,那么如果API不起作用,那最终是他们的问题,而不是你的问题。当然,你应该让你的客户达到一个合理的标准,但这并不意味着仅仅因为他们拒绝满足你的需求或为每个人的利益而制定的技术标准,就要为他们竭尽全力 是的,这是可能的。使用
$\u服务器[“查询字符串”]
对于您的urlwww.url.com/script.php?xml=
,$\u服务器[“查询字符串”]
应该包含,xml=
下面的代码应该提取xml数据
$pos=strpos($_SERVER["QUERY_STRING"], 'xml');
$xml="";
if($pos!==false){
$xml = substr($_SERVER["QUERY_STRING"], $pos+strlen("xml="));
}
是的,这是可能的。使用
$\u服务器[“查询字符串”]
对于您的urlwww.url.com/script.php?xml=
,$\u服务器[“查询字符串”]
应该包含,xml=
下面的代码应该提取xml数据
$pos=strpos($_SERVER["QUERY_STRING"], 'xml');
$xml="";
if($pos!==false){
$xml = substr($_SERVER["QUERY_STRING"], $pos+strlen("xml="));
}
如果您使用的唯一参数是
xml=
,并且它始终位于前面,并且没有其他参数,则可以执行类似以下伪代码的操作:
if (count($_GET)>1 or is_not_well_formed_xml($_GET['xml'])) {
$xml = substr($_SERVER['QUERY_STRING'], 4);
if (is_not_well_formed_xml($xml)) {
really_fail();
}
}
但是,您应该告诉客户机修复他们的代码,特别是因为他们很容易遵守标准!如果xml包含?
或
,您可能仍然会遇到问题,因为php或web服务器可能会对查询字符串的起始位置感到困惑(弄乱了$\u服务器['query\u string']
,PHP、客户端代码、中间代理或web服务器可能会对#
感到困惑,因为这通常是片段的开始
例如,在查询参数中,这样的内容可能无法可靠传输: