如何在xml文件中“POST”数据,然后在另一端收到

时间:2015-11-18 15:35:39

标签: php html xml curl

我正在尝试习惯使用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变量中。它应该显示在屏幕上,但我得到的只是空白......

我已经阅读了无数的例子并且遵循了许多不同的指南,但是无法按照我期望的方式使其工作。谁能请我摆脱困境?

3 个答案:

答案 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.
  

注意:

     
      
  1. 如果您使用的是json_decode,则会获得stdclass obje
  2.   
  3. 如果您使用的是unserialize,那么您将获得simplexmlobj
  4.   

答案 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的手册。你已经怀疑某些事情与你想象的有所不同,你对此是正确的。

关于帖子的一些好的和简单的信息:

  • POST请求永远不会被缓存
  • POST请求不会保留在浏览器历史记录中
  • POST请求无法加入书签

您可以在此处找到其他信息:

因此,在您的情况下,您必须保存XML。我不知道你打算做什么,但这是一个小方法:

只需从cURL请求中获取XML,将其保存在file_put_contents()的文件中并添加条件(如果isset 发布[您的密钥] ,则文件写入其他显示文件)到您的站点或拆分文件,一个只显示输出的文件和一个接收您的请求并更新XML的文件。

我做了这个(发布[你的密钥])粗体,因为你必须保护它至少一点,否则我只是发布到你的页面,它会改变。

请注意,如果没有SSL,确实不可能来保护您的请求,但您至少可以使用帖子中的某个键来验证这是您的脚本,帖子来自哪里。

其他信息:

回到你的问题: 如果您发布了一些内容,您可以在接收者文件中看到帖子内容var_dump(),如果您在浏览器中导航到该文件$_POST是空的,因为您没有发布任何内容,你刚刚创建了一个GET请求。我不想让你感到困惑,但GET请求方法(通常)与PHP $_GET变量=&gt;无关。 HTTP Request Methods