【问题标题】:PHP Curl request to IIS results in request format is invalidPHP Curl 请求到 IIS 导致请求格式无效
【发布时间】:2011-04-05 14:25:37
【问题描述】:

我正在尝试使用 curl 访问 3rd 方 Web 服务,我使用了以下代码,如果我在自己的 linux 服务器上尝试它,效果很好,数据发送正常,但是 3rd 方服务器上的 IIS 返回一个错误。

$longdata 是一长串数据,长度可能超过 1000 个字符

第 3 方有许多具有各种实现的工作客户,所以问题在我这边。

我需要在请求中添加什么才能通过它?

<?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.

    */
?>

【问题讨论】:

  • 我的问题是我没有发送application/x-www-form-urlencoded 数据,但这是服务器所期望的。

标签: php asp.net iis curl


【解决方案1】:

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

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

【讨论】:

  • 如何在此处添加code$xmlstring = '';code 作为文件?
【解决方案2】:

有一个类似的问题,将 XML 发送到 IIS。

使用这个 php 函数解决:http_build_query($params);

看来IIS需要post数据是URL风格的。

这个真的很像Tobias Fü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));

【讨论】:

  • http_build_query($params); 在我的一个项目中解决了类似的问题。
【解决方案3】:

在不了解全部细节的情况下有点棘手,您的 cURL 脚本的登陆服务器可能会拒绝访问。例如:

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

只需添加它,看看它是否有帮助,就像您没有发送 user_agent 一样,或者拾取了无法识别的 1,也许他们拒绝访问。

【讨论】:

  • 好的,试过了,添加了行,同样的问题...还有其他想法吗?
【解决方案4】:

读取响应看起来服务器希望查看使用不同 Content-Type 发送过来的表单数据。它可能需要设置为 multipart/form-data。

【讨论】:

  • 我尝试添加 curl_setopt($c, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data')); // 同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 2023-03-19
  • 1970-01-01
  • 2019-03-09
相关资源
最近更新 更多