从PHP调用Java编写的SOAP Web Service时方法参数接收空值
解决Java RPC风格SOAP WebService被PHP调用时参数为空的问题
首先先把你贴的Java服务端代码格式化一下,方便咱们看清楚细节:
@SOAPBinding(style = Style.RPC) @WebService(serviceName = "Test") public class Test { @WebMethod(operationName = "hello") public String hello( @WebParam(name = "name1") String txt1, @WebParam(name = "name2") String txt2 ) { System.out.println("Request : Hello " + txt1+" , "+txt2); return "Response : Hello " + txt1 + " , " + txt2; } }
我之前帮朋友排查过几乎一模一样的问题,核心原因是RPC风格的SOAP服务对参数命名和请求格式的要求特别严格,PHP端如果参数名没对应上,服务端就会收到空值。咱们一步步来解决:
1. 修正PHP调用的参数键名
你PHP代码里的参数键名必须和Java代码里@WebParam(name = "xxx")的name值完全一致,而不是方法的参数变量名(也就是不能用txt1/txt2,必须用name1/name2)。
错误示例(会导致空参数):
$client = new SoapClient("http://你的服务地址?wsdl"); // 这里用了参数变量名txt1/txt2,和@WebParam的name不匹配 $result = $client->hello(array('txt1' => 'Alice', 'txt2' => 'Bob'));
正确示例:
$client = new SoapClient("http://你的服务地址?wsdl"); // 键名严格对应@WebParam的name:name1和name2 $params = array( 'name1' => 'Alice', 'name2' => 'Bob' ); $result = $client->hello($params); // RPC风格的SOAP返回通常会自动给结果加Return后缀,所以用helloReturn获取值 echo $result->helloReturn;
2. 查看请求XML验证参数是否正确传递
如果还是有问题,建议开启PHP SOAP客户端的trace选项,打印出实际发送的SOAP请求XML,确认参数是否真的被正确传入:
$client = new SoapClient("http://你的服务地址?wsdl", array('trace' => 1)); $params = array('name1' => 'Alice', 'name2' => 'Bob'); $result = $client->hello($params); // 打印请求XML echo "请求XML:\n" . $client->__getLastRequest() . "\n";
正常情况下,你应该能看到XML里包含这两个参数:
<SOAP-ENV:Envelope ...> <SOAP-ENV:Body> <ns1:hello> <name1>Alice</name1> <name2>Bob</name2> </ns1:hello> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
如果<name1>和<name2>不存在或者名字不对,那就是参数传递的问题,回头检查你的PHP代码键名。
3. 手动指定命名空间和SOAPAction(可选)
有些情况下,PHP的SOAP客户端可能会默认使用错误的命名空间,导致服务端无法解析参数。这时候可以用__soapCall方法手动指定:
// 从你的WSDL里获取目标命名空间(Java里如果没指定@WebService的targetNamespace,默认是包名反向,比如com.example的话就是http://example.com/) $namespace = "http://你的服务命名空间/"; $client = new SoapClient("http://你的服务地址?wsdl"); $params = array( 'name1' => 'Alice', 'name2' => 'Bob' ); // 手动指定命名空间和SOAPAction $result = $client->__soapCall('hello', array($params), array( 'uri' => $namespace, 'soapaction' => $namespace . 'hello' )); echo $result->helloReturn;
按照这几步来,基本就能解决参数为空的问题了。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

