php调用java发布的webservice

java 使用 spring webservice 发布的 service,由php使用SoapClient调用。

遇到有一个奇怪的现象,java调用发布的webservice,没有问题,使用工具SOAP UI调用,没有问题,

同样的php代码调用google的天气服务没问题,调用我们的wsdl就不行。

经过摸索调试,发现如下问题,以及解决的过程。

 

首先发布的wsdl如下:

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch="http://www.phpxiaoxin.com/doorway" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.phpxiaoxin.com/doorway" targetNamespace="http://www.phpxiaoxin.com/doorway">
  <wsdl:types>
    <s:schema xmlns:dw="http://www.phpxiaoxin.com/doorway" xmlns:s="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.phpxiaoxin.com/doorway">
      <s:complexType name="Error">
        <s:attribute name="Code" type="s:string" use="required"/>
        <s:attribute name="Message" type="s:string" use="required"/>
      </s:complexType>
      <s:simpleType name="Status">
        <s:restriction base="s:string">
          <s:enumeration value="Successful"/>
          <s:enumeration value="Failed"/>
        </s:restriction>
      </s:simpleType>
      <s:complexType abstract="true" name="BaseRequest">
        <s:attribute name="Token" type="s:string" use="required"/>
        <s:attribute name="UserName" type="s:string" use="required"/>
        <s:attribute name="Password" type="s:string" use="required"/>
      </s:complexType>
      <s:complexType abstract="true" name="BaseResponse">
        <s:sequence>
          <s:element minOccurs="0" name="Error" type="dw:Error"/>
        </s:sequence>
        <s:attribute name="Token" type="s:string" use="required"/>
        <s:attribute name="Status" type="dw:Status" use="required"/>
      </s:complexType>
      <s:complexType name="StatusResponse">
        <s:complexContent>
          <s:extension base="dw:BaseResponse"/>
        </s:complexContent>
      </s:complexType>
        <s:attribute name="RatePlanCode" type="s:string" use="required"/>
        <s:attribute name="RoomTypeCode" type="s:string" use="required"/>
        <s:attribute name="NumberOfUnits" type="s:int" use="required"/>
        <s:attribute name="HotelCode" type="s:string" use="required"/>
        <s:attribute name="DistributorReservationId" type="s:string" use="required"/>
      </s:complexType>
      <s:element name="PingRequest">
        <s:complexType>
          <s:complexContent>
            <s:extension base="dw:BaseRequest">
              <s:attribute name="Echo" type="s:string" use="required"/>
            </s:extension>
          </s:complexContent>
        </s:complexType>
      </s:element>
      <s:element name="PingResponse">
        <s:complexType>
          <s:complexContent>
            <s:extension base="dw:StatusResponse">
              <s:attribute name="Echo" type="s:string" use="required"/>
            </s:extension>
          </s:complexContent>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="PingResponse">
    <wsdl:part element="tns:PingResponse" name="PingResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="PingRequest">
    <wsdl:part element="tns:PingRequest" name="PingRequest">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="Doorway">
    <wsdl:operation name="Ping">
      <wsdl:input message="tns:PingRequest" name="PingRequest">
    </wsdl:input>
      <wsdl:output message="tns:PingResponse" name="PingResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="DoorwaySoap11" type="tns:Doorway">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="Ping">
      <soap:operation soapAction=""/>
      <wsdl:input name="PingRequest">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="PingResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="HotelDoorwayService">
    <wsdl:port binding="tns:DoorwaySoap11" name="DoorwaySoap11">
      <soap:address location="/soap/doorway/"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

 

其中定义了一个方法"Ping" 输入为PingRequest 和 PingResponse 其中PingRequest包含一个echo的属性,并集成一个BaseRequest的对象。

 

下面是使用php调用的代码:

 

<?php
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache
$wsdl="http://10.10.10.10:8888/doorway/soap/doorway/doorway.wsdl";
$soap=new SoapClient($wsdl, array( 'trace'=>true,'cache_wsdl'=>WSDL_CACHE_NONE, 'soap_version'   => SOAP_1_1));
$method="Ping";
$params = array('Token'=>'E30ED3AA-65DE-48F9-BEA4-BA021B119625','UserName'=>'cccc','Password'=>'pppp', 'Echo'=>'hello');
try{
$result=$soap->$method($params);
}catch(Exception $e) {
    echo "Exception: " . $e->getMessage();
}
//$result为stdClass类型,因此不能使用 echo $result的方式输出,会报错的。
echo $result->Echo;
?>

 

最初我们调用的时候获取到的错误是找不到Ping方法,这个后来不确定是如何解决的。

后来加了SoapClient 的调用参数WSDL_CACHE_NONE让soap调用的时候不缓存wsd,以避免服务器修改了wsdl无法及时更新。设置此参数后,每次调用,都会重新load wsdl文件,因此监控java的log,将会拿到一个get请求,起初我们以为是调用wsdl的请求,后来发现,他是拿wsdl的请求。

 

过了这关后,会遇到如下错误:Unable to parse URL

 

这个原因经过google之后发现问题出在wsdl上面:<soap:address location="/soap/doorway/"/>

这里有的wsdl会:<soap:address location=""/>

这种方式使用java调用是没有问题的,但是使用php调用就是不行。再加上错误的提示信息,可以理解为,SoapClient没有智能的解析这个location,因此无法调用到soap的地址(这里称之为地址,其实我也不知道是什么意思,要想搞懂的可以看wsdl的协议。)

 

按照往上介绍的方法,在SoapClient调用里面增加参数:location =>"http://www.phpxiaoxin.com/soap/doorway"

但这种方法显然是不太好的,更好的方法是在生成的wsdl中就将location参数直接设置成绝对的url地址不要是相对的,也不要是空。

 

另外需要注意一个细节就是soap_version,分为:SOAP_1_1,SOAP_1_2 这两者发送的header是不一样的,一个是:text/xml一个是soap/xml,有的时候不兼容,就会将请求拒绝掉。

 

最后还有一个问题就是组装调用方法参数:

所调用方法应该组装的参数,主要看方法对应的wsdl中的input,对于Ping方法来说,就是PingRequest。

pingRequest继承了一个BaseRequest,那么相当于PingRequest有:token、username、password,以及自身的echo,因此将这些属性直接组装成array塞进去就ok了。

 

这里没有实验过一个方法对应多个输入对象应该如何处理,大家可以自己去试。而对已简单到String类型的输入参数来说,我这边的param为:$params = array('arg0'=>"hello111");

不过我的这个我使用的是另外一个wsdl,其输入参数的wsdl为(使用spring+cxf+aegis数据绑定生成):

 

<xsd:complexType name="sayHello">
    <xsd:sequence>
    <xsd:element minOccurs="0" name="arg0" nillable="true" type="xsd:string"/>
    </xsd:sequence>
</xsd:complexType>
 

大家可以看看对应关系。是否能看出点什么规律。而对于复杂的对象,则可以层层的array进行嵌套。可以参开这个文章:PHP SOAP如何传入复杂对象

 

 

最后提醒一下:

php使用webservice的时候,需要确认开启了php_soap、php_curl的扩展(php.ini)

关于php的soap client 以及其option参数,可以参考官网:http://www.php.net/manual/en/soapclient.soapclient.php

 

使用php最好配置上xdebug以便可以调试,看到对象的值,相当明了,

SoapClient里面有发送的request的xml一看就知道是否有问题,以及问题出在哪里。

详情可以看一下xdebug等文章。

 

再就是php调用的时候我增加了try,catch,并且将exception输出,这样输出的结果似乎比直接跑异常要详细。

因此建议大家遇到问题的时候可以catch一下,以便能够看到详细的异常信息。

 

另外如果有对spring发布webservice以及spring+cxf发布webservice有问题的也可以找相关文章看一下。这里就不贴地址了。我也曾经介绍过cxf的。

 

总结一下,出错的缘由,由于本次webservice使用了手写xsd的方式,先手工写出了xsd,然后再生成的接口和对象,因此导致location设置不兼容。

 

 

 

参考:

unable-parse-url

nusoap-how-to-change-content-type-of-request

终于解决了PHP调用SOAP过程中的种种问题

 

分享一个xml在线格式化的工具:http://www.shell-tools.net/index.php?op=xml_format

PHP中如何调用webservice的实例参考 下面用一个例子说明:web service服务是查询QQ用户是否在线 使用php5开发客户端:复制代码 代码如下:<?phptry {    //$client = new SoapClient(“HelloService.wsdl”,array(‘encoding’=>’UTF-8’));    $client = new SoapClient(“http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl”);    var_dump($client->__getFunctions());    print 立即下载

相关推荐

Windows下的Geant4安装教程

本教程将从0开始展示在Windows下如何安装Geant4,包括各种辅助工具(QT、Cmake、Visual Studio)的下载安装,环境变量的配置,以及example的生成等。

weixin_49065278的博客 4106

WebService的描述与注册、发布

柴晓路(fennivel@uddi-china.org)  ChiefSystemArchitect   2001年9月20日 (本文最初由IBMdeveloperWorks中国网站发表,其网址是http://www.ibm.com/developerWorks/cn/) 本文是架构Web服务的系列文章的第六篇,也是最后一篇,文本以前文为基础,在前文的应用实例的基础上,考察了发布Web服务界面...

weixin_34250434的博客 269

Python小白也能玩转迅投QMT量化交易?手把手教你从安装到第一个策略

本文为零基础Python用户提供了上手迅投QMT量化交易平台的完整指南。从Python 3.6环境配置、QMT客户端获取安装,到核心概念讲解,并手把手教你编写并回测一个经典的双均线交易策略,帮助初学者快速迈出量化交易的第一步。

weixin_29103191的博客 763

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

前言:刚刚做了一个事,php调java的soap接口,但是并没有什么文档,只有看以前写的java调用用来写。所以java是可以正常调用的,出现的问题是php能调到接口,但是接收不了参数。开始没看懂那个java调用,设置targetNamespace是什么鬼,翻遍了php手册,吧英文翻译过来看了才知道,SoapVar对应了soap数据的封装。网上收了,发现他们都在乱答。浪费我时间,还不如自己看手册。...

weixin_42365334的博客 317

Qlib上手学习记录

Qlib 是一个面向人工智能的量化投资平台,其目标是通过在量化投资中运用AI技术来发掘潜力、赋能研究并创造价值,从探索投资策略到实现产品化部署。该平台支持多种机器学习建模范式,包括有监督学习、市场动态建模以及强化学习等。真的是走了很多弯路step 1. 使用 ananconda 建立环境,要主要必须是 python 3.8失败的下了以后 进入 glib folder 后执行是会报错的,不管你还什么source 都一样,整了很久使用前最好看下这个。

chenchihwen的专栏 3099

STM32 使用rtthread的DMA 串口发送失败

在一次使用RTthread的DMA 串口发送时,持续性通过DMA 发送串口数据时,偶发发送过程中后续数据包无法正常发送出去,后经查,发现为RT-Thread的串口中断处理有瑕疵,后做出修改。另,为了更方便的排查为题,建议修改。左为修改前,右为修改后。

qq_39294918的博客 1108

php java webservice_php调用java发布的webservice

java 使用 spring webservice 发布的 service,由php使用SoapClient调用。遇到有一个奇怪的现象,java调用发布的webservice,没有问题,使用工具SOAP UI调用,没有问题,同样的php代码调用google的天气服务没问题,调用我们的wsdl就不行。经过摸索调试,发现如下问题,以及解决的过程。首先发布的wsdl如下:其中定义了一个方法"Ping" ...

weixin_32612347的博客 359

MSP430项目设计:2020年TI杯大学生电子设计竞赛 坡道行驶电动小车(C题)循迹小车(分享项目展示视频与源码)

文章目录题目要求一、硬件设计二、理论分析与计算三、电路与程序设计四、测试方案与测试结果五、项目展示 哔哩哔哩项目展示视频:https://www.bilibili.com/video/BV1oz4y1d7mH/ 百度网盘资料链接:https://pan.baidu.com/s/1PC-lkSORH_XCgIG-u3HCog 提取码:c7zz 取走记得点赞啊! 题目要求 1.任务 利用TI的MSP430/MSP432平台,设计制作一个四轮电动小车。要求小车能沿着指定路线在坡道上自动循迹骑线行驶。小车必须独立

mbs706的博客 4万+

php soap调用java_php调用java发布的webservice

java 使用 spring webservice 发布的 service,由php使用SoapClient调用。遇到有一个奇怪的现象,java调用发布的webservice,没有问题,使用工具SOAP UI调用,没有问题,同样的php代码调用google的天气服务没问题,调用我们的wsdl就不行。经过摸索调试,发现如下问题,以及解决的过程。首先发布的wsdl如下:Xml代码 其中定义了一个方法...

weixin_39759881的博客 215

MATLAB - ROS 2 工具箱入门教程

ROS 工具箱提供了一个连接 MATLAB® 和 Simulink® 与机器人操作系统(ROS 和 ROS 2)的接口。利用该工具箱,您可以设计 ROS 节点网络,并将 MATLAB 或 Simulink 生成的 ROS 节点与现有的 ROS 网络相结合。工具箱包括 MATLAB 函数和 Simulink 块,可通过记录、导入和回放 rosbag 文件来可视化和分析 ROS 数据。您还可以连接到实时 ROS 网络,访问 ROS 消息。

机器人控制与仿真应用 3068

PyRoki 入门教程(二)安装与使用

PyRoki是一个用于机器人运动学优化的Python库,具有模块化设计、可扩展性和跨平台支持等特点。它支持逆运动学、轨迹优化和动作重定位等任务,采用Levenberg-Marquardt优化器提高效率。主要功能包括:基于URDF的可微分正向运动学模型、自动生成碰撞基元、通用成本因子和自定义成本函数等。PyRoki支持CPU、GPU和TPU运行,适用于从单机器人到大规模并行处理场景。目前存在一些限制,如仅支持软约束、静态形状和特定关节类型等。官方提供了多个应用示例,包括基础逆运动学、碰撞检测、轨迹优化和手部/

机器人控制与仿真应用 1252

PHP调用JAVA发布的WebService

前言:自从互联网起步,到发展壮大以来,已经深入到了各个领域。用户的需求体验也慢慢提高了,对应的互联网相关开发技术也越来越多。但是我们知道每一门开发语言都是在某种环境下应运而生,有的发展越来越大,越来越成熟稳定。但是有的开发语言则好景不长。这里就有很多人关注的问题,哪种计算机语言是最好的语言。我还是那句话,每种语言诞生的背景不同,解决的问题不同,因此各有千秋。所以提出两个问题:...

weixin_33943836的博客 191

汇川AM系列ethercat控制伺服的使用说明(含转矩模式)

本文以一个实际例子,介绍ethercat伺服驱动器的工作原理,以及在汇川AM系列PLC中,如何点动、定位、速度、转矩控制ethercat伺服。

qq_34047402的博客 5112

PHP soap 调用 JAVA发布的webservice

php通过接口调用数据时,长用的为:http和webservice两种方法。 http 是指:接口端提供http链接,将数据以json或XML格式输出到网页中。php调用端通过file_get_contents或curl方法来调用,GET/POST方式来传参。 webservice是指:通过soap读写接口,现在着重来介绍一下这种方法。 php5以后提供了原生的soap方法:SoapClien

hulkwang的博客 6729

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

php java soap服务,PHP soap 调用 JAVA发布的webservice

php通过接口调用数据时,长用的为:http和webservice两种方法。http 是指:接口端提供http链接,将数据以json或XML格式输出到网页中。php调用端通过file_get_contents或curl方法来调用,GET/POST方式来传参。webservice是指:通过soap读写接口,现在着重来介绍一下这种方法。php5以后提供了原生的soap方法:SoapClient,需要开...

weixin_31083901的博客 151

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java写 soapclient,PHP通过SoapClient调用Java发布的WebService

php通过接口调用数据时,长用的为:http和webservice两种方法。http 是指:接口端提供http链接,将数据以json或XML格式输出到网页中。php调用端通过file_get_contents或curl方法来调用,GET/POST方式来传参。webservice是指:通过soap读写接口,现在着重来介绍一下这种方法。php5以后提供了原生的soap方法:SoapClient,需要开...

weixin_31190099的博客 648

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Php如何编写webservice,跨语言java调用的解决方案

php发布webservice,java调用

u014265398的博客 756

java php webservice

刚在项目中应用到了java与php通过webservice进行数据交互。觉得挺有意思,贴出来,跟大家分享。 一.java编写webservice服务端,php作为客户端调用. 1.首先我们写一个简单的java类并发布webservice. package com.php; import java.util.Map; /*** @author yangjuqi * @createdate ...

态度决定一切,努力奋斗ing QQ:8790671 127

php与java webservice_刚在项目中应用到了java与php通过webservice进行数据交互。觉得挺有意思,贴出来,跟大家分享。...

刚在项目中应用到了java与php通过webservice进行数据交互。觉得挺有意思,贴出来,跟大家分享。一.java编写webservice服务端,php作为客户端调用.1.首先我们写一个简单的java类并发布webservice.package com.php;import java.util.Map;/*** @author yangjuqi* @createdate 2009-5-18 下...

weixin_28868927的博客 211

webservice:(1)新手搭建调用webservice那些坑

今天主要和大家分享搭建java版webservice,以及php调用webservice遇到的一些坑<(^-^)>简洁版教程(博客内容大部分纯手打,纯亲测)

Joryun_Blog 1万+

java php webservice相互调用

2009-06-02 17:50:13|  分类: IT技术 |  标签: |字号大中小 订阅        刚在项目中应用到了java与php通过webservice进行数据交互。觉得挺有意思,贴出来,跟大家分享。 一.java编写webservice服务端,php作为客户端调用. 1.首先我们写一个简单的java类并发布webservice. package c

盐碘 1441

Java CXF调用PHP[其它语言]的Web Service

最近在研究ProcessMaker

lld2002的专栏 918

WebService是什么 04

WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧… 问题一 如果我们的网站需要提供一个天气预报这样一个需求的话,那我们该怎么做????? 天气预报这么一个功能并不是简单的JS组件就能够实现的,它的数据是依赖数据库分析出来的,甚至需要卫星探测…我们个人建站是不可能搞这么一个数据库的吧。 那么既然我们自己干不了,我们可以去找别人吗???我们从搜索引擎搜索,...

啊策策大数据社区 183

WebService学习笔记

一、WebService概述 1.1 什么是WebService    基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 一个跨语言、跨平台的规范(抽象) 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 多个跨平台...

weixin_30685029的博客 71
上一篇: 当for in 遇到 prototype框架
下一篇: jquery plugin list
xiaoxinphp
博客等级 码龄18年 1粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值