2011-02-17 59 views
0

因此,我需要从公共API检索XML,但我的应用程序在Flash中,公共服务不会实现crossdomain.xml文件。我在网上找到了这个PHP脚本(见下文),以便代理请求URL。它工作正常的网址,如:PHP代理获取XML:URL参数问题

http://mysite.com/xml_proxy.php?url=http://rss.cnn.com/rss/cnn_topstories.rss

但脚本似乎无论带或忽略对URL的任何参数,如:

http://mysite.com/xml_proxy.php?url=http://publicapiserver.com?app_ID=35235x&app_key=84x

我PHP无知。有没有简单的方法让这个脚本处理这些URL参数?非常感谢。下面是该脚本:

<?php 

$post_data = $HTTP_RAW_POST_DATA; 

$header[] = "Content-type: text/xml"; 
$header[] = "Content-length: ".strlen($post_data); 

$ch = curl_init($_GET['url']); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 

if (strlen($post_data)>0){ 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 
} 

$response = curl_exec($ch);  
$response_headers = curl_getinfo($ch);  

if (curl_errno($ch)) { 
    print curl_error($ch); 
} else { 
    curl_close($ch); 
    header('Content-type: ' . $response_headers['content-type']); 
    print $response; 
} 
?> 

回答

1

如果你想要的网址,通过以作为毫发无损URL参数的脚本得到,你必须url-encode首先,在Flash端。例如,正确的URL中使用到你的脚本为你的例子其实是:

http://mysite.com/xml_proxy.php?url=http%3A%2F%2Fpublicapiserver.com%3Fapp_ID%3D35235x%26app_key%3D84x 

否则你的web服务器,PHP将得到非常困惑,你的URL位是代理服务的URL,以及哪一位是您想要从中获取数据的网址。

Flash方面的解决方案可能取决于您目前如何进行呼叫。但Actionscript有一个escape()函数,它会为你做编码。您只需要编码您要发送给代理的URL,而不是代理本身的URL,因此请保留代理网址原样(“http://mysite.com/xml_proxy.php?url=” ),然后在其结尾处抛出您希望从中获取数据的站点的escape()的URL。

您不需要从PHP端做任何事情,因为PHP会自动对其$ _GET变量中的参数进行url解码,这就是您如何在PHP代码中抓取该URL。

+0

噢,伙计......这非常有意义。谢谢。 – Gregir 2011-02-17 21:14:22

0

加入这一行,如果你需要代理SOAP客户端:

$header[] = "SOAPAction: ".$_SERVER['HTTP_SOAPACTION'];