Php cURL base64_编码XML

Php cURL base64_编码XML,php,curl,asp.net-web-api,base64,Php,Curl,Asp.net Web Api,Base64,我试图将base64_编码的xml字符串卷曲成我无法控制的c#WebAPI。我可以成功地卷曲字符串,但API不接受它 记录输出显示cURL正在从base64字符串中剥离+个字符,我认为这就是问题所在 我的密码是: $username = "username"; $password = "$23hrlkbl"; $xml = "<Envelope><Header><User>".$username."</User><Password>".

我试图将base64_编码的xml字符串卷曲成我无法控制的c#WebAPI。我可以成功地卷曲字符串,但API不接受它

记录输出显示cURL正在从base64字符串中剥离+个字符,我认为这就是问题所在

我的密码是:

$username = "username";
$password = "$23hrlkbl";
$xml = "<Envelope><Header><User>".$username."</User><Password>".$password."</Password></Header></Envelope>";

$passThru = "https://api.domain.com/SignIn.aspx?passthruUrl=/Management/Api/DataEnrichment/GetAddresses/?buildingNumber=1%26streetName=Nightingale%20Road%26postcode=L12%200QN
$post_packet_data = 'XMLdataPacket='.urlencode(base64_encode($xml));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $passThru);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_packet_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

$response = curl_exec ($ch);
curl_close($ch);
print_r($response);
但是,当通过cURL发布相同的字符串时,将发送以下内容,但不接受

XMLdataPacket=PEVudmVsb3BlPjxIZWFkZXI PFVzZXI dXNlcm5hbWU8L1VzZXI PFBhc3N3b3JkPiQyM2hybGtibDwvUGFzc3dvcmQ PC9IZWFkZXI PC9FbnZlbG9wZT4=
更新

在与API的开发人员交谈后,他们确认请求现在以正确的格式出现,但认为由于发送了不正确的头,因此没有处理调用。他们用fiddler向我发送了一个工作呼叫的标题:

POST https://api.domain.com/SignIn.aspx?passthruUrl=/Management/Api/DataEnrichment/GetAddresses/?buildingNumber=1%26streetName=Nightingale%20Road%26postcode=L12%200QN HTTP/1.1
Host: test.domain.com
Connection: keep-alive
Content-Length: 164
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Cookie: ASP.NET_SessionId=uzwfjq3zojao3l5fw141l453

XMLdataPacket=PEVudmVsb3BlPjxIZWFkZXI%2BPFVzZXI+dXNlcm5hbWU8L1VzZXI%2BPFBhc3N3b3JkPiQyM2hybGtibDwvUGFzc3dvcmQ%2BPC9IZWFkZXI%2BPC9FbnZlbG9wZT4%3D
我将如何修改cURL调用的标题以复制上述内容。当前再次使用fiddler时,cURL调用头显示如下:

GET http://test.domain.com/test_call.php HTTP/1.1
Host: test.domain.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: CAKEPHP=g22d7kf7qs8b1v02uui2mnop30
Authorization: Basic bmV0aG91c2VwcmljZXMxOnRlbXAxODkx
Connection: keep-alive
Cache-Control: max-age=0

数据在api端作为POST接收,但curl头作为GET发送,根据上面的

尝试使用rawurlencode()而不是urlencode()-它使用“%20”而不是“+”字符对空格字符进行编码。

另一个建议是尝试这样做:
$POST\u packet\u data=http\u build\u query(数组('XMLdataPacket'=>base64_编码($bym_头)),null,&')
这将处理URL编码这确实会使cURL输出的POST数据看起来与HTML表单中的数据相同,但API仍然拒绝它。这可能与发送的POST类型或错误的标题有关吗?您应该会收到一些错误消息,可以发布吗?可能与标题有关因为你提到了,如果你通过表单发布,它是有效的。它是什么类型的API?它是SOAP吗?是的,它是一个SOAP API,我相信是用c#.net编写的。没有返回任何错误。不幸的是,如果调用成功,则返回XML如果不成功,则重定向到登录页面,因此我得到返回的HTML。我不认为问题在您的cURL请求中,但在SOAP客户端中。它是一个可以看到WSDL的公共API吗?不幸的是,这似乎没有帮助。查看日志,从cURL输出的POST数据现在看起来与从表单POST输出的数据相同,但通过cURL对API的调用仍然被拒绝。
GET http://test.domain.com/test_call.php HTTP/1.1
Host: test.domain.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: CAKEPHP=g22d7kf7qs8b1v02uui2mnop30
Authorization: Basic bmV0aG91c2VwcmljZXMxOnRlbXAxODkx
Connection: keep-alive
Cache-Control: max-age=0