我有一个基于 php 的网站,它连接到第三方 SOAP Web 服务。
我正在成功创建和解析请求和响应信封 xml。唯一的问题是实际沟通。我正在使用套接字,因为我将此代码视为示例,并且能够对其进行修改以适用于我们的情况。
$socket = fsockopen("ssl://***",443);
if ($socket!==false){
$request = "POST /***.asmx HTTP/1.1\n".
"Host: ***\n".
"Content-Type: text/xml; charset=utf-8\n".
"Content-Length: ".strlen($request)."\n".
"SOAPAction: \"http://***\"\n\n".
$request."\n";
fputs($socket, $request);
然而,读取响应总是挂起,直到连接超时。这是由于我用来读取的方法FGETS
需要行尾或文件尾标记,它没有从 Web 服务接收。结果,我被迫一次读取一个字节的响应并检查 SOAP 信封是否关闭,然后手动停止。这对我来说似乎有些低效。
while (!feof($socket) && substr($response,-16) != "</soap:Envelope>" ) {
$response .= fgets($socket,2); // force read one byte at a time
}
所以,我的问题是:这是 .net Web 服务的已知现象吗?有没有更好的方法来执行这种通信,或者特别是读取(FGETS 除外)?
在一个稍微不相关的注释中,为什么 fgets 函数需要我指定 2 来读取 1 个字节?(或者这是否与字符集有关,即:如果响应是 utf8 则 1 个字符由 2 个字节表示)