全部,在PHP中,来自cURL的POST请求如何/不像来自Flash中loadVars的POST请求?
对不起 - 这可能是一个很奇怪的问题。
我正在使用Flash RIA。它所做的一件事就是调用一个ASP页面(驻留在另一个域中)来检索一些数据。
但是,该ASP页面要求用户在允许调用该ASP页面之前登录该网站。
因此,我第一次尝试在Flash应用程序中使用它,是使用loadVars.sendAndLoad()将登录变量发布到登录页面。这将设置cookies/session变量来建立我的“登录”状态。然后,稍后,当Flash应用程序调用ASP页面来请求所需的数据时,一切正常。换句话说,对第一页的loadVars.sendAndLoad调用使我登录,并且以某种方式维护了登录状态,以便稍后Flash应用程序调用ASP页时,ASP页认为我仍然记录in。
一个很好的解决方案,除了现在Flash应用程序将部署在另一个域中。换句话说,ASP页面(和登录页面)位于domainA.com上,但Flash应用程序将位于domainB.com上。并且Flash应用程序不能调用不同域的URL(我知道跨域策略文件,但出于各种原因,这不是一种选择)。
所以,我的下一个想法是 - 在domainB.com上设置一个PHP页面,它使用cURL将登录变量传递到登录页面。在domainB.com上设置另一个使用cURL调用ASP页面的PHP页面。
然后,我可以设置我的Flash应用程序来调用那些充当“代理”的PHP页面。
但是,这不起作用。当我调用第一个PHP页面(它将变量传递到domainA.com上的登录页面)时,我认为这是有效的。但是,如果我然后调用第二个PHP页面,则domainA.com上的ASP页面会拒绝该请求,就好像我没有登录。
换句话说,当我将所有内容都运行在Flash之外 - 看起来像“登录”状态从第一个请求维持到后续请求。但是,当我运行PHP页面中的所有内容时,登录状态不会被保留。
第一个PHP页面似乎将我登录到系统中。但第二个PHP页面没有记入登录。
任何想法如何在Flash和PHP中处理不同的cookie来解释这种差异?
根据任何建议或指导,我很乐意提供更多的细节。
非常感谢提前!
---- ----编辑
基于了不起的意见和建议,我已经得到了这个工作。我没有机会擦亮它;可能有些卷曲选项是不必要的或多余的。但至少,它的工作。下面的代码:
<?php
$ckfile = tempnam (".", "CURLCOOKIE");
$url_1 = 'https://somedomain.com/loginService';
$url_2 = 'https://somedomain.com/getMyData.asp';
$fields_1 = array(
'field1'=>"blah",
'field2'=>"blah",
'field3'=>"blah",
);
$fields_2 = array(
'fieldX'=>"blah",
'fieldY'=>"blah",
'fieldZ'=>"blah",
);
$a='';
$postvars_1 = '';
foreach($fields_1 as $key=>$value) {
$postvars_1.= $a.urlencode($key).'='.urlencode($value);
$a='&';
}
$a='';
$postvars_2 = '';
foreach($fields_2 as $key=>$value) {
$postvars_2.= $a.urlencode($key).'='.urlencode($value);
$a='&';
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($ch, CURLOPT_URL, $url_1);
curl_setopt($ch, CURLOPT_POST, count($fields_1));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars_1);
$result_1 = curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, $url_2);
curl_setopt($ch, CURLOPT_POST, count($fields_2));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars_2);
$result_2 = curl_exec($ch);
curl_close($ch);
header("Content-type: text/xml");
print $result_2;
unlink($ckfile);
?>
不用说,有可能是更好的方式来做到这一点,或者我的代码一些严重的问题。但现在工作总比没有好。没有社区和下面的人的帮助,我永远都不会得到这个工作。非常感谢!
Dougle - 非常感谢您的回应!如果您有机会再次观看,我已经添加了脚本。 – mattstuehler 2009-08-10 18:48:52