PHP Curl请求IIS导致请求格式无效



我正在尝试使用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.
    */
?>

对于那些像我一样通过谷歌来到这里的人,我发现了一篇解决这个问题的文章。

http://www.developersalley.com/blog/post/2011/06/22/SystemInvalidOperationException-Request-format-is-invalid-multipartform-data-boundary-Error-When-Calling-Net-Web-Service-from-PHP.aspx

基本上,必须对数据数组

进行字符串化
$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);

在向IIS发送XML时遇到了类似的问题。

http_build_query($params);

似乎IIS需要post数据为URL样式

这个和Tobias fnke解决方案非常相似。

所以你可以这样使用这个函数:

$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));

在不知道全部细节的情况下更棘手的是,cURL脚本的着陆服务器可能拒绝访问。如:

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11;Linux x86_64;rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre');

只是添加,看看它是否有帮助,如果你没有发送一个user_agent,或者一个无法识别的1被捡起,也许他们拒绝访问。

从响应中可以看出,服务器似乎希望看到以不同的Content-Type发送的表单数据。它可能需要设置为multipart/form-data

最新更新