我正在尝试习惯使用cURL,并且已经碰壁了。目前我有两个PHP脚本,一个站点上托管的“发送者”和一个完全不同的站点上不同域下托管的“接收者”。我希望发件人读取保存在文件夹中的xml文件,并将其发布到接收者。然后,当我加载接收器页面时,我想看到屏幕上显示的xml内容。
到目前为止,这是我的代码。
SENDER。
//Load the xml file, into an object called $message.
if(file_exists('../XML/example.xml')) {
$message = simplexml_load_file('../XML/example.xml');
}
else
{
exit ('Could not load the xml file from the specified path location');
}
//POST the data using cURL to the receiving page.
$url = "http://dev.somewhere_else.com/receiver.php"; //destination
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $message);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
// The output gets generated and looks like an array
例如:
array(4){[“@ attribute”] => string(5)“Array”[“header_section”] => string(23)“”[“application_section”] => string(18)“”[“name”] => string(7)“example”}
到目前为止一切顺利?理论上,这意味着通过cURL的响应是预期的数据。然而,当我去另一个网站并加载接收页面时,我没有看到类似的东西......
array(0) { }
result =
接收机。
// Display the contents of the super global..
var_dump($_POST);
此页面上显示“array(0){}”。我怀疑因为数据是xml,所以没有填充$ _POST。令人费解的是,发送者的响应正确显示。为了解决这个问题,我添加了..
$dataFromPost = file_get_contents('php://input');
echo"<br><br>result =";
echo $dataFromPost;
所以最后三行应该从我的“sender”读取传入的流并将其放在$ dataFromPost变量中。它应该显示在屏幕上,但我得到的只是空白......
我已经阅读了无数的例子并且遵循了许多不同的指南,但是无法按照我期望的方式使其工作。谁能请我摆脱困境?
答案 0 :(得分:0)
您正在错误地设置帖子字段。通常,您希望传递一个CURLOPT_POSTFIELDS
的数组,如下所示:
curl_setopt($ch, CURLOPT_POSTFIELDS, array('message' => $message));
通过使用http_build_query()
构建查询字符串,甚至更好:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('message' => $message)));
PHP手册还介绍了posting the entire file with this setting:
的方法要在HTTP&#34; POST&#34;中发布的完整数据操作。 发布文件, 使用@前缀文件名并使用完整路径。文件类型可以是 通过跟随文件名中的类型明确指定 格式&#39 ;; type = mimetype&#39;。此参数可以作为a传递 urlencoded string like&#39; para1 = val1&amp; para2 = val2&amp; ...&#39;或者作为一个数组 字段名称为键,字段数据为值。如果value是一个数组, Content-Type标头将设置为multipart / form-data。截至PHP 5.2.0,如果使用@前缀将文件传递给此选项,则value必须是数组。从PHP 5.5.0开始,不推荐使用@前缀和文件 可以使用CURLFile发送。可以禁用@前缀以确保安全 通过设置CURLOPT_SAFE_UPLOAD传递以@开头的值 选项为TRUE。
然后,您应该能够从$_POST
接收数据,但是您决定发送它。
答案 1 :(得分:0)
我没有尝试过以下解决方案,但您可以尝试
发件人代码 制作对象的JSON字符串
$post_data['xmlobj'] = json_encode($message) //or u can use` serialize/unserialize
在您的请求中传递帖子数据数组
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
收件人代码。
在接收点获取Post数组使用json_decode 从post数组中获取object_string并解码它
$obj = json_decode($_POST['xmlobj']); // if you are using serialize then use unserialize here.
注意:
- 如果您使用的是json_decode,则会获得stdclass obje
- 如果您使用的是unserialize,那么您将获得simplexmlobj
醇>
答案 2 :(得分:0)
就像我们在评论中发现的那样,脚本本身似乎可以正常工作,因为您正在获取处理过的XML,如下所示:
//输出生成并看起来像一个数组,例如:array(4){ [ “@属性”] =&GT; string(5)“Array”[“header_section”] =&gt; string(23)“ “[”application_section“] =&gt; string(18)”“[”name“] =&gt; string(7) “例子”}
所以我认为你只是误解了POST,所以我建议你看一下$_POST的手册。你已经怀疑某些事情与你想象的有所不同,你对此是正确的。
关于帖子的一些好的和简单的信息:
您可以在此处找到其他信息:
因此,在您的情况下,您必须保存XML。我不知道你打算做什么,但这是一个小方法:
只需从cURL请求中获取XML,将其保存在file_put_contents()的文件中并添加条件(如果isset 发布[您的密钥] ,则文件写入其他显示文件)到您的站点或拆分文件,一个只显示输出的文件和一个接收您的请求并更新XML的文件。
我做了这个(发布[你的密钥])粗体,因为你必须保护它至少一点,否则我只是发布到你的页面,它会改变。
请注意,如果没有SSL,确实不可能来保护您的请求,但您至少可以使用帖子中的某个键来验证这是您的脚本,帖子来自哪里。
其他信息:
回到你的问题:
如果您发布了一些内容,您可以在接收者文件中看到帖子内容var_dump()
,如果您在浏览器中导航到该文件$_POST
是空的,因为您没有发布任何内容,你刚刚创建了一个GET请求。我不想让你感到困惑,但GET请求方法(通常)与PHP $_GET
变量=&gt;无关。 HTTP Request Methods