在 PHP 中如何使用 curl

问题描述

以下 curl 命令工作正常。

curl --header "Content-Type: application/soap+xml" --header "Accept: text/xml" --header "SOAPAction: ''" --data-binary @signedSoapRequest.xml http://服务器:8081/WebService

我正在尝试使用 curl 从 PHP 复制相同的内容,如下所示。但它失败并显示错误代码 403

    $message = <?xml version="1.0"....signed xml data...</SOAP-ENV:Envelope>
    $headers = array(
        "Content-type: text/xml;charset=\"utf-8\"","Accept: text/xml","Cache-Control: no-cache","Pragma: no-cache","SOAPAction: ''","Content-length: ".strlen($message),);

    $result = array();

    $ch = curl_init();
    curl_setopt($ch,CURLOPT_VERBOSE,false);
    curl_setopt($ch,CURLOPT_URL,$this->endpoint);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_TIMEOUT,30);
    curl_setopt($ch,TRUE);
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
    curl_setopt($ch,CURLOPT_POST,CURLOPT_POSTFIELDS,$message);
    $result['soap_result'] = $this->cleanXML(curl_exec($ch));

如果在 $message 中,我存储了一个简单的 xml 而不是像下面 curls 命令那样的签名 xml 数据。 curl --header "Content-Type: application/soap+xml" --header "Accept: text/xml" --header "SOAPAction: ''" --data @SoapRequest.xml http://server:8081/WebService

对于这个 curl 命令,PHP 代码工作正常。 由于此 curl 命令使用 --data 标志,这意味着文本文件/数据而不是二进制/签名数据。

任何想法它也可以与签名的 xml 一起使用。我尝试设置 content-type: appplicaton/octet-stream 但同样的 403 错误。 (403)禁止

解决方法

代码 curl_setopt($ch,CURLOPT_POSTFIELDS,$message); 替换为 curl_setopt($ch,file_get_contents('soapRequest.xml'))

它开始工作正常。

不是在 $message 变量中指定文件的值,然后在 CURLOPT_POSTFIELDS 中设置 $message,现在使用 file_get_contents() 读取文件并设置 CURLOPT_POSTFIELDS。

PHP cURL: how to set body to binary data?得到的提示