You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter调用PHP SOAP API出现500错误,请求协助排查

问题分析与解决方案

错误根源

出现500错误+SOAP Client Bad Request的核心原因有三点:

  1. PHP服务端手动解析SOAP请求XML并输出额外内容,破坏了SoapServer的自动响应流程
  2. 服务端方法未声明参数,无法接收SOAP传递的参数
  3. Flutter请求的SOAPAction格式不符合服务端预期

修改后的PHP服务端代码

<?php
class MyService {
    // 声明参数$name,SoapServer会自动映射SOAP请求中的参数
    public function sayHello($name) {
        return "Hello, $name!";
    }
}

$server = new SoapServer(null, array('uri' => 'http://localhost/MyServiceServer.php'));
$server->setClass('MyService');
$server->handle();
?>

关键修改点:

  • 移除手动读取php://input解析XML的代码,依赖SoapServer自动完成参数映射
  • 删除所有echo语句,避免破坏SOAP响应的XML格式
  • 给sayHello方法添加$name参数,匹配请求中的参数名

修改后的Flutter请求代码

Future<String> sayHello() async {
  const name = 'John';
  final url = 'http://localhost/MyServiceServer.php';
  final response = await http.post(
    Uri.parse(url),
    headers: {
      'Content-Type': 'text/xml;charset=UTF-8',
      // 调整SOAPAction格式为{uri}/{method},匹配服务端配置
      'SOAPAction': 'http://localhost/MyServiceServer.php/sayHello'
    },
    body: '''<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/MyServiceServer.php">
  <SOAP-ENV:Body>
    <ns1:sayHello>
      <name>$name</name>
    </ns1:sayHello>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>''',
  );

  if (response.statusCode == 200) {
    final xml = response.body;
    final regex = RegExp(r'<return.*?>(.*?)<\/return>');
    final match = regex.firstMatch(xml);
    final message = match?.group(1) ?? 'No response message';
    return message;
  } else {
    print('Failed to call SOAP API: ${response.statusCode}');
    print('Response body: ${response.body}');
    throw Exception('Failed to call SOAP API');
  }
}

关键修改点:

  • 调整SOAPAction为http://localhost/MyServiceServer.php/sayHello,符合多数SOAP服务器的格式要求
  • 简化XML命名空间,移除不必要的xsd、xsi、SOAP-ENC声明,减少格式冲突
  • 优化响应解析的默认值,避免空指针问题

调试建议

  1. 先用Postman发送SOAP请求测试服务端:
    • 请求方法:POST
    • Content-Type:text/xml;charset=UTF-8
    • SOAPAction:http://localhost/MyServiceServer.php/sayHello
    • 请求体使用上述Flutter中的XML内容
  2. 检查PHP错误日志,确认是否有语法或运行时错误
  3. 确保Flutter应用和PHP服务在同一网络下(比如本地测试时,用电脑IP代替localhost,避免模拟器/真机的网络隔离问题)

内容的提问来源于stack exchange,提问作者Kendaichi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:15:21