php - xml 的 CURL 命令无法通过 php 脚本发送
问题描述
我已经使用这个 linux 命令发送 xml CURL 请求
curl -f -d
'<REQ>
<FEATURE>COMMON</FEATURE>
<TIME-STAMP>ddmmyyyy HH:MM:SS</TIME-STAMP>
<OPERATION-CODE>DEACTIVATE</OPERATION-CODE>
<CLIENT-TRANS-ID>3256778901</CLIENT-TRANS-ID>
<BODY>
<DATASET>
<PARAM>
<NAME>PRODUCT-CODE</NAME>
<VALUE>T-1234</VALUE>
</PARAM>
<PARAM>
<NAME>CP-ID</NAME>
<VALUE>111</VALUE>
</PARAM>
<PARAM>
<NAME>CHANNEL-ID</NAME>
<VALUE>WAP</VALUE>
</PARAM>
<ADDITIONAL-PARAM>
<PARAM>
<NAME>LANGUAGE</NAME>
<VALUE>1</VALUE>
</PARAM>
<PARAM>
<NAME>KEYWORD</NAME>
<VALUE>LS</VALUE>
</PARAM>
</ADDITIONAL-PARAM>
</DATASET>
</BODY>
</REQ>'
'http://192.168.xx.xxx:8088/HttpAdapter'
它工作正常。
但是当我尝试使用 PHPI 时出现错误
$input_xml = "<REQ>
<FEATURE>COMMON</FEATURE>
<TIME-STAMP>ddmmyyyy HH:MM:SS</TIME-STAMP>
<OPERATION-CODE>DEACTIVATE</OPERATION-CODE>
<CLIENT-TRANS-ID>3256778901</CLIENT-TRANS-ID>
<BODY>
<DATASET>
<PARAM>
<NAME>PRODUCT-CODE</NAME>
<VALUE>T-1234</VALUE>
</PARAM>
<PARAM>
<NAME>CP-ID</NAME>
<VALUE>111</VALUE>
</PARAM>
<PARAM>
<NAME>CHANNEL-ID</NAME>
<VALUE>WAP</VALUE>
</PARAM>
<ADDITIONAL-PARAM>
<PARAM>
<NAME>LANGUAGE</NAME>
<VALUE>1</VALUE>
</PARAM>
<PARAM>
<NAME>KEYWORD</NAME>
<VALUE>ls</VALUE>
</PARAM>
</ADDITIONAL-PARAM>
</DATASET>
</BODY>
</REQ>
";
$url = "http://192.168.xx.xxx:8088/HttpAdapter";
//setting the curl parameters.
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/xml',
'Connection: Keep-Alive'
));
curl_setopt($ch, CURLOPT_URL, $url);
// Following line is compulsary to add as it is:
curl_setopt($ch, CURLOPT_POSTFIELDS,
"xmlRequest=" . $input_xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
$data = curl_exec($ch);
curl_close($ch);
//convert the XML result into array
$array_data = json_decode(json_encode(simplexml_load_string($data)), true);
print_r('<pre>');
print_r($array_data);
print_r('</pre>');
这次我收到“5689 featureID not sent with the request”。错误代码是 1003。我的 PHP 代码没有任何错误。如何使用 php CURL 发送此 xml 请求。
解决方案
您的 php 代码xmlRequest=
添加到 POST 正文中,而您的 curl 代码没有。只需更换
curl_setopt($ch, CURLOPT_POSTFIELDS, "xmlRequest=" . $input_xml);
和
curl_setopt($ch, CURLOPT_POSTFIELDS, $input_xml);
并且请求应该大致相似(不完全相似,例如,命令行 curl 有一个看起来像的默认用户代理User-Agent: curl/7.63.0
,而 libcurl 以及扩展的 php 的 curl_* api 没有默认用户代理,但是您可以使用 CURLOPT_USERAGENT 设置一个)
..这些示例也不应该起作用,因为您在两种情况下都发送了错误的 Content-Type 标头,您正在发送
Content-Type: application/x-www-form-urlencoded
但正确的类型应该是:
Content-Type: application/xml
..我猜服务器只是忽略了 Content-Type 标头,因为您的 curl 调用确实有效。除非明确记录,否则这可能是一个错误,您可能应该让服务器开发人员知道。
推荐阅读
- python-3.x - TypeError:“int”类型的对象在目标函数非线性优化 Gekko 中没有 len()
- mongodb - MongoDB 时间 小时和分钟的差异
- xaml - 以渐变为背景的 XAML 全局样式
- ios - 尽管使用了 safeAreaLayoutGuide,但以编程方式在视图中创建约束并不是导航控制器的原因
- typescript - 为什么我的 Firebase Functions 模拟器没有运行我在 Typescript 中所做的更改?
- ios - 为什么 `Podfile.lock` 会更改 `pod install` 上的 `SPEC CHECKSUMS` 部分,而没有任何更改?
- python - 从 www.NSEINDIA.com wesbite 抓取时结果为空
- python - Keras 模型有时无法训练
- python - 使用熊猫从列中获取最小值并在与之关联的另一列中获取字符串
- android - 使用 Retrofit enqueue 调用遇到问题