如何在PHP中创建HTTP POST XML请求实际上将XML数据发送到我的供应商的服务器?

时间:2016-05-16 15:59:52

标签: php xml curl

我正在处理一些PHP代码,它会生成一个动态XML输出,我想将HTTP POST发送到我的供应商的服务器。

我的主要目标是让我的商品库存水平与我的供应商的库存水平同步,当我将请求作为输入发布时,我应该从他们的服务器返回一个输出。

我正在使用DOMDocument创建xml字符串,到目前为止这没问题,它运行正常。

但是当我尝试使用" cUrl"来尝试HTTP POST时方法或" file_get_contents()"方法。建立了连接,但服务器响应是一个错误,表示"在HTTP POST"中没有收到XML。

我只是使用标准代码,正如本文中所解释的那样Sending XML data using HTTP POST with PHP像解释这两种方法的许多其他文章一样。

cUrl方法:

$post_data = //the raw xml string or XML file from the DOMDocument.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://websiteURL");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$content=curl_exec($ch);

或file_get_contents()方法:

$stream_options = array(
'http' => array(
    'method'  => 'POST',
    'header'  => 'Content-type: application/x-www-form-urlencoded' . "\r\n",
    'content' =>  $post_data));

$context  = stream_context_create($stream_options);
$response = file_get_contents($url, null, $context);

这两种方法都给我一个来自服务器的响应," HTTP POST中没有收到XML"。

如果我是print_r($ post_data);它显示了我想发送的xml字符串。像:

1. <?xml version="1.0" encoding="UTF-8"?> 
2. <pnarequest><customer.nr>some no.</customer_nr><password>some no.</password><Item><vare_nr>some sku no.</vare_nr>

新信息:

我的供应商表示他们接收了我的HTTP POST,但帖子中的内容是变量&#34; $ post_data&#34;作为纯文本,而不是变量内的内容。

有人可以帮我理解为什么没有发布XML数据吗?

感谢。

我的问题的答案: 我需要创建密钥&#34; xml =&#34;在帖子中,我的xml($ Post_data)作为变量。此外,我需要从我的供应商那里获取正确的用户信息,以便放入我的xml变量中。现在它有效! - 感谢所有帮助评论此问题的人。

1 个答案:

答案 0 :(得分:0)

看起来您没有对帖子数据进行编码,也没有为XML字段定义变量名称。此处的HTTP请求,因为您正在使用帖子,应该看起来像是从具有单个textarea的表单发送的请求。

<?php

$post_data = rawurlencode($post_data);   
curl_setopt($ch, CURLOPT_POSTFIELDS, 'xml=' . $post_data);

?>

如果您需要在POST数据中包含更多变量。

<?php

$key = '12345';

$post_data =
    'xml=' . rawurlencode($post_data) .
    '&key=' . rawurlencode($key);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

?>

这是我的最后一个示例代码。您没有使用键和值正确发布。你说你已经使用了另一个问题的示例卷曲代码,除非你没有,因为他们明确在接受的答案中使用了键和值而你却没有。另外,我刚检查了他们在网站上提供的表格。关键名称应该是'xml',就像我预期的那样,帖子应该看起来像一个带有单个textarea的表单,就像我预期的那样。

<?php

$xml = '<?xml version="1.0"...';

$post_data =
    'xml=' . rawurlencode($post_data) .
    '&key=' . rawurlencode($key);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://websiteURL");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$content=curl_exec($ch);