我正在处理一些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变量中。现在它有效! - 感谢所有帮助评论此问题的人。
答案 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);