1

我有一个基于 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 个字节表示)

4

0 回答 0