代码之家  ›  专栏  ›  技术社区  ›  dan richardson

如何通过curl和php发送SOAP XML?

  •  33
  • dan richardson  · 技术社区  · 14 年前

    这已经困扰了我好几天了;我正试图通过curl发送一个SOAP帖子,但是我一直收到一个“无法连接到主机”的错误,但是,我真的不知道该怎么做。

    我有一个ASP版本,它可以在相同的URL和数据下正常工作。我认为这只是一个php/curl的东西。

    我目前有以下代码 CURLOPT_POSTFIELDS 数据是有效的SOAP信封字符串):

    $soap_do = curl_init();
    curl_setopt($soap_do, CURLOPT_URL,            "https://xxx.yyy.com:517/zzz.asmx" );
    curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($soap_do, CURLOPT_TIMEOUT,        10);
    curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($soap_do, CURLOPT_POST,           true );            
    curl_setopt($soap_do, CURLOPT_POSTFIELDS,     '<soap:Envelope>...</soap:Envelope>'); 
    curl_setopt($soap_do, CURLOPT_HTTPHEADER,     array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen('<soap:Envelope>...</soap:Envelope>') ));
    
    if(curl_exec($soap_do) === false)
    {                
        $err = 'Curl error: ' . curl_error($soap_do);
        curl_close($soap_do);
        return $err;
    }
    else
    {
        curl_close($soap_do); 
        return 'Operation completed without any errors';
    }
    

    所以你知道为什么它总是出错吗?

    ASP版本工作正常!代码是:

    Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")
    xmlhttp.Open "POST","https://xxx.yyy.com:517/zzz.asmx"
    xmlhttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
    xmlhttp.Send('<soap:Envelope>...</soap:Envelope>')
    
    6 回复  |  直到 9 年前
        1
  •  36
  •   Cody Gray    13 年前

    伙计,你的代码对我有用。

    代码如下:

    $soap_do = curl_init(); 
    curl_setopt($soap_do, CURLOPT_URL,            $url );   
    curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($soap_do, CURLOPT_TIMEOUT,        10); 
    curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);  
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($soap_do, CURLOPT_POST,           true ); 
    curl_setopt($soap_do, CURLOPT_POSTFIELDS,    $post_string); 
    curl_setopt($soap_do, CURLOPT_HTTPHEADER,     array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen($post_string) )); 
    curl_setopt($soap_do, CURLOPT_USERPWD, $user . ":" . $password);
    
    $result = curl_exec($soap_do);
    $err = curl_error($soap_do);  
    
        2
  •  11
  •   whoan    9 年前

    我不得不使用

    $headers = array(             
        "Content-type: text/xml;charset=\"utf-8\"", 
        "Accept: text/xml", 
        "Cache-Control: no-cache", 
        "Pragma: no-cache", 
        "SOAPAction: \"run\"", 
        "Content-length: ".strlen($xml),
    ); 
    

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    
        3
  •  4
  •   Tobias Fünke    12 年前

    对于那些从Google中找到这个的人,我遇到了一个类似的问题,当ASP方法运行良好时,我试图从PHP与.NET SOAP服务器进行交互。

    我使用了一个包嗅探器来查看ASP客户机正在发送什么,确切地说,我注意到它在初始身份验证请求之后包含了cookie。所以我把曲奇放在卷发里,效果很好。

    $cookiePath = tempnam('/tmp', 'cookie');
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
    
        4
  •  3
  •   whoan    9 年前

    这可能很旧,但这对我有用。我最初为一个XML日志使用了这个函数,在更改 HTTPHEADER text/xml 而不是 application/xml :

    function doXMLCurl($url,$postXML){
        $CURL = curl_init();
    
        curl_setopt($CURL, CURLOPT_URL, $url); 
        curl_setopt($CURL, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
        curl_setopt($CURL, CURLOPT_POST, 1); 
        curl_setopt($CURL, CURLOPT_POSTFIELDS, $postXML); 
        curl_setopt($CURL, CURLOPT_HEADER, false); 
        curl_setopt($CURL, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($CURL, CURLOPT_HTTPHEADER, array('Accept: text/xml','Content-Type: text/xml'));
        curl_setopt($CURL, CURLOPT_RETURNTRANSFER, true);
        $xmlResponse = curl_exec($CURL); 
    
        return $xmlResponse;
    }
    
        5
  •  2
  •   Alistair    14 年前

    尝试使用curlopt-port设置端口号,因为它可能不喜欢将其作为URL的一部分?

        6
  •  1
  •   Adam    14 年前

    您还使用了错误的内容类型,application/xml是正确的类型。但这对卷曲的要求没有任何影响。