php调用java写的WebService不能传参问题解决

前言: 

刚刚做了一个事,php调java的soap接口,但是并没有什么文档,只有看以前写的java调用用来写。所以java是可以正常调用的,出现的问题是php能调到接口,但是接收不了参数。

开始没看懂那个java调用,设置targetNamespace是什么鬼,翻遍了php手册,吧英文翻译过来看了才知道,SoapVar对应了soap数据的封装。

网上收了,发现他们都在乱答。浪费我时间,还不如自己看手册。

问题出在:命名空间

java soapClient: 

/**
 * saleOrderInfo 为参数‘{"order":"00122211111","date":"2017-04-14","customer_id":"027"}‘;
 */
public String callWebService(String saleOrderInfo) throws ServiceException, 
   RemoteException{
	// webservice路径  
        // 这里后面加不加 "?wsdl" 效果都一样的  
        String endpoint = "http://127.0.0.1/service?wsdl";  
        // 发送短信接口方法名  
        String operationName = "sendSaleOrder";  
        String targetNamespace = "http://service.test.bb.service/";  
        // 定义service对象  
        org.apache.axis.client.Service service = new org.apache.axis.client.Service();  
        // 创建一个call对象  
        Call call = (Call) service.createCall();  
        // 设置目标地址,即webservice路径  
        call.setTargetEndpointAddress(endpoint);  
        
        call.setOperationName(new QName(targetNamespace, operationName));  
        
        call.addParameter(new QName("http://test.bb.service/", "saleOrderInfo"), 
        XMLType.XSD_STRING, ParameterMode.IN); 
        call.setReturnClass(String.class);  
        // 解决错误:服务器未能识别 HTTP 头 SOAPAction 的值  
        call.setUseSOAPAction(true);  
        call.setSOAPActionURI("");
        Object obj = call.invoke(new Object[]{saleOrderInfo});
        String result = ObjectUtils.toString(obj);
        if(StringUtils.isBlank(result)){
        	result = "{\"message\":\"接口返回结果为空!\",\"retCode\":\"0\"}";
        }
   return result;
}


开始错误的php调用方式 soapClient:

<?php

//指定WebService路径并初始化一个WebService客户端
$ws = "http://127.0.0.1/service?wsdl";//webservice服务的地址
$client = new SoapClient ($ws);

//参数
$params = ‘{"order":"00122211111","date":"2017-04-14","customer_id":"027"}‘;

$result=$client->sendSaleOrder([saleOrderInfo => $params]);
echo "<pre>";print_r($result);//显示结果

//调用成功,但是参数接收不到


正确的php调用方式 soapClient:

<?php

//指定WebService路径并初始化一个WebService客户端
$ws = "http://127.0.0.1/service?wsdl";//webservice服务的地址
$client = new SoapClient ($ws);

//参数
$params = ‘{"order":"00122211111","date":"2017-04-14","customer_id":"027"}‘;

$wrapper = new StdClass;

$wrapper->saleOrderInfo = new SoapVar($params, XSD_STRING, "string", 
"http://test.bb.service/", "saleOrderInfo", "http://test.bb.service/");
$searchrequest = new SoapParam($wrapper, "sendSaleOrder");

$result=$client->sendSaleOrder($searchrequest);
echo "<pre>";print_r($result);//显示结果

//调用成功

后言: 

是的,如你所见。问题就是出在命名空间,service端设置了方法和参数的命名空间,然而方法的命名空间service端设置了默认的地址,所以调用的时候设置了参数的命名空间就能传参了。

SoapVar是php开放的主要用来封装用于放入 SOAP 请求中的数据,包括命名方式。

时间: 2024-10-30 23:50:43

php调用java写的WebService不能传参问题解决的相关文章

.net调java写的webService传过去的datetime,int等非string类型为null的问题

使用.NET向webService传double.int.DateTime 服务器得到的数据时null的问题 收藏 用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和DateTime类型的值(在服务端得到的均为null) 解决办法: VS2005封装WebService引用时,如果WebService发布的是一个基本数据类型组成的对象,则会对该对象的

在Android中调用C#写的WebService(附源代码)

由于项目中要使用Android调用C#写的WebService,于是便有了这篇文章.在学习的过程中,发现在C#中直接调用WebService方便得多,直接添加一个引用,便可以直接使用将WebService当做一个对象使用,利用Vs2010中的代码提示功能就能爽歪歪地把想要的东西全部点出来.在Android调用,麻烦了一点,但是也还好.主要是我们需要自己在代码中确定要调用WebService的方法名是什么,要传给WebService什么参数以及对应的参数名,另外,一些额外的信息比如soap的版本号

用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获得值!

用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和DateTime类型的值(在服务端得到的均为null) 解决办法: VS2005封装WebService引用 用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.doub

安卓开发 调用java写的jax-ws 格式的webservices

public static final String NAME_SPACE = "http://webService.sxthnet/"; public static String URL = "http://100.123.68.166:8080/wbs1/Server1Port"; public static String Method2="sayhello2"; public final String Action2=NAME_SPACE+

用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获

用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获得值! 用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和DateTime类型的值(在服务端得到的均为null) 解决办法: VS2005封装WebService引用 用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属

用delphi的THTTPRIO控件调用c#写的webservice。

用delphi的THTTPRIO控件调用c#写的webservice 下面是我调试时遇到的一些问题: 1,导入wsdl文件:file--new----other----wenservice---WSDLimporter---输入wsdl地址:如下:http://10.0.1.128:7777/ShineMediaPublish/WebService/WebServiceCall.asmx?wsdl 注意末尾的:'?wsdl'不能少.要不可能会说找不到. 2,设置THTTPRIO控件的属性: 开始

.Net下实现配置化调用JAVA开发的WebService

各个系统之间进行数据交互是重要的部分,WebService是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,使用较为方便,闲话少说,正式进入到关于在.Net中调用java开发的接口. 目前JAVA开发WebService的方式很很多种:Axis2.CXF.xfire等等,但是在.Net中调用这些接口无法实现配置IP的形式进行替换调用服务,那这个问题该如何解决? 笔者测试发现相同框架开发的接口是可以进行配置URL来改变调用接口,前提是需要对JAVA基于不同框架的接口进行引用,在V

.net 客户端调用java或.net webservice进行soapheader验证

最近项目中有业务需要跨平台调用web服务,客户端和服务器之间采用非对称加密来保证数据的安全性,webservice的安全验证基于soapheader. 借此机会,顺便整理一下调用.net webservice 和 java webservice 的验证方式,记录下来. .net端web服务 1.若web服务是采用.net webservice实现,如下代码: /// </summary> [WebService(Namespace = "http://tempuri.org/&quo

Delphi7调用C#写的Webservice

一.使用VS创建及发布webservice 添加新项:WEB服务(ASMX) 编写测试函数,前面加上    [WebMethod]方可调用 生成后发布程序: 添加IIS部署网站 将发布后的public文件夹复制到服务器上的对应路径,通过控制面板--管理工具--打开IIS 部署后打开网站提示如下错误: 默认文档添加默认页即可 重新启动服务后打开如下页面 查看服务说明复制如下地址,在delphi7中添加wsdl引用 二.delphi7中调用部署好的webservice服务 File--New--Ot