我正在尝试使用curl访问第三方Web服务,我使用以下代码,如果我在我自己的Linux服务器上尝试它,数据正在发送正常,但第三方服务器上的IIS返回错误。
$ longdata是一长串数据,可能超过1000个字符
第三方有许多工作客户,各种各样的实施,所以问题就在我身边。
我需要在请求中添加什么才能完成此操作?
<?php
$c = curl_init();
// curl_setopt($c, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($c, CURLOPT_URL, 'http://XXX.com/test/index.asmx');
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_HEADER, 1);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$post = array('param1' => 'XXXX', "param2" => "Y", "Param3" => $long_data);
curl_setopt($c, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($c);
echo $response;
/*
Response:
HTTP/1.1 100 Continue
HTTP/1.1 500 Internal Server Error
Date: Tue, 05 Apr 2011 14:11:51 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 100
Request format is invalid: multipart/form-data; boundary=----------------------------5d738237d9e0.
*/
?>
答案 0 :(得分:4)
对于那些通过谷歌来到这里的人,就像我一样,我发现了一篇解决问题的文章。
基本上,您必须对数据数组进行字符串化
$post_array = array(
"Param1"=>'xyz',
"Param2"=>'abc',
"Param3"=>'123'
);
//url-ify the data
foreach($post_array as $key=>$value)
{
$post_array_string .= $key.'='.$value.'&';
}
$post_array_string = rtrim($post_array_string,'&');
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_POST,count($post_array ));
curl_setopt($ch,CURLOPT_POSTFIELDS,$post_array_string);
答案 1 :(得分:1)
发生类似的问题,将XML发送到IIS。
使用这个php函数解决:http_build_query($ params);
似乎IIS需要帖子数据采用网址格式。
这个与TobiasFünke解决方案非常相似。
所以你可以这样使用这个功能:
$post_array = array(
"Param1"=>'xyz',
"Param2"=>'abc',
"Param3"=>'123'
);
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_POST,count($post_array));
curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($post_array_string));
希望这有帮助。
答案 2 :(得分:0)
在不了解完整详细信息的情况下更加棘手,cURL脚本的登陆服务器可能会拒绝访问。 EG:
curl_setopt($ ch,CURLOPT_USERAGENT,'Mozilla / 5.0(X11; Linux x86_64; rv:2.2a1pre)Gecko / 20110324 Firefox / 4.2a1pre');
只需添加一下,看看它是否有帮助,就好像你没有发送user_agent,或者拾取了一个无法识别的1,可能是他们拒绝访问。
答案 3 :(得分:0)
阅读响应,看起来服务器希望看到使用不同的Content-Type发送的表单数据。可能需要将其设置为multipart / form-data。