java调用WebService(未完成)记录篇
背景:
通过一个实例来认识webservice
服务端
public interface ExampleService {
String sayHi(String request);
}
@WebService
public class ExampleServiceImpl implements ExampleService{
@Override
public String sayHi(String request) {
return "request:"+request+"response:hi";
}
}
public class ExampleServe {
public static void main(String[] args) {
//接口发布的地址
Endpoint.publish("http://localhost:8080/example",new ExampleServiceImpl());
//查看WebService服务是否启动 url+?wsdl
//http://localhost:8080/example?wsdl是否能显示
System.err.println("服务发布成功");
}
}
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://summary.webservice.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="ExampleServiceImplService" targetNamespace="http://summary.webservice.com/">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://summary.webservice.com/" elementFormDefault="unqualified" targetNamespace="http://summary.webservice.com/" version="1.0">
<xs:element name="sayHi" type="tns:sayHi"/>
<xs:element name="sayHiResponse" type="tns:sayHiResponse"/>
<xs:complexType name="sayHi">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="sayHiResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="sayHiResponse">
<wsdl:part element="tns:sayHiResponse" name="parameters"> </wsdl:part>
</wsdl:message>
<wsdl:message name="sayHi">
<wsdl:part element="tns:sayHi" name="parameters"> </wsdl:part>
</wsdl:message>
<wsdl:portType name="ExampleServiceImpl">
<wsdl:operation name="sayHi">
<wsdl:input message="tns:sayHi" name="sayHi"> </wsdl:input>
<wsdl:output message="tns:sayHiResponse" name="sayHiResponse"> </wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ExampleServiceImplServiceSoapBinding" type="tns:ExampleServiceImpl">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sayHi">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="sayHi">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sayHiResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ExampleServiceImplService">
<wsdl:port binding="tns:ExampleServiceImplServiceSoapBinding" name="ExampleServiceImplPort">
<soap:address location="http://localhost:8080/example"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
客户端
wsimport -s ./src/main/java/ -p com.webservice.summary.client -encoding utf-8 http://localhost:8080/example\?wsdl -d ./target/classes
会生成我们需要的文件,大致包含以下这些

public class ExampleClient {
public static void main(String[] args) {
ExampleServiceImplService exampleServiceImplService=new ExampleServiceImplService();
ExampleServiceImpl exampleServiceImplPort = exampleServiceImplService.getExampleServiceImplPort();
String result = exampleServiceImplPort.sayHi("这是参数");
System.out.println(result);
}
}
WebService的一些概念
踩坑之旅
务必保证提供方的wsdl可以通过浏览器打开
sap提供的wsdl
无法读取 WSDL 文档:*******
原因为 1) 找不到文档; 2) 无法读取文档; 3) 文档的根元素不是 <wsdl:definitions>。
[ERROR] failed.noservice=在提供的 WSDL 中找不到 wsdl:service:
需要至少提供一个 WSDL, 该 WSDL 至少具有一个服务定义。
-<wsdl

wsdl鉴权问题
wsimport使用authfile
wsimport -Xauthfile sap.txt http://*******.com:8001/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/yws_get_str/200/yws_get_str/yws_get_str?sap-client=200
test:123456@http://*******.com:8001/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/yws_get_str/200/yws_get_str/yws_get_str?sap-client=200
****************不是有效的授权信息格式。格式应为 http[s]://user:pa
ssword@host:port//<url-path>。
*************
需要授权, 请在C:\Us
ers\****\.metro\auth中提供具有读取访问权限的授权文件, 或者使用 -Xauthfile 指定授权文
件并在每一行上使用以下格式提供授权信息: http[s]://user:password@host:port//<url-path>
wsimport example.wsdl
方法重名
[WARNING] 忽略 SOAP 端口 "example_interface_12": 它使用非标准 SOAP 1.2 绑定。
必须指定 "-extension" 选项以使用此绑定。
正在生成代码...
[ERROR] 无法生成 SEI, 类com.sap.document.sap.soap.functions.mc_style.example_interface已存在
。请使用 JAX-WS 定制设置重命名 wsdl:portType "{urn:sap-com:document:sap:soap:functions:mc-style}ZC
example_interface"
为什么重?

解决方案


参数问题
鉴权:
public final class ExampleServiceImpl_ExampleServiceImplPort_Client {
private static final QName SERVICE_NAME = new QName("http://summary.webservice.com/", "ExampleServiceImplService");
private ExampleServiceImpl_ExampleServiceImplPort_Client() {
}
public static void main(String args[]) throws java.lang.Exception {
URL wsdlURL = ExampleServiceImplService.WSDL_LOCATION;
if (args.length > 0 && args[0] != null && !"".equals(args[0])) {
File wsdlFile = new File(args[0]);
try {
if (wsdlFile.exists()) {
wsdlURL = wsdlFile.toURI().toURL();
} else {
wsdlURL = new URL(args[0]);
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
ExampleServiceImplService ss = new ExampleServiceImplService(wsdlURL, SERVICE_NAME);
ExampleServiceImpl port = ss.getExampleServiceImplPort();
{
System.out.println("Invoking sayHi...");
java.lang.String _sayHi_arg0 = "";
java.lang.String _sayHi__return = port.sayHi(_sayHi_arg0);
System.out.println("sayHi.result=" + _sayHi__return);
}
System.exit(0);
}
}
Server returned HTTP response code: 401 for URL
url = new URL("*******");
Authenticator.setDefault( new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"username",
"passwd".toCharArray());
}
});
WSDL_LOCATION = url;
None of the policy alternatives can be satisfied.
final String username = "";
final String password = "";
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setAddress(address);
factory.setServiceClass(ExampleServiceImpl.class);
factory.setUsername(username);
factory.setPassword(password);
ExampleServiceImpl bean = (ExampleServiceImpl) factory.create();
//组装参数
...
//组装参数结束
bean.hi(参数)
参数:
Web service processing error; more details in the web service error log on provider side
注意点
- 如果本来将代码放在A包下,因某些业务将代码迁移到B包下之后,记得修改interface类的@RequestWrapper和@ResponseWrapper后的className里的包名
- 在对应的serviceImpl里面:url = new URL("x"); x是wsdl的地址,如果是sap的话,那就是浏览器可以打开的那个地址
- factory.setAddress(address); 这里的address不是wsdl地址,而是你的wsdl和下图位置一样的地方的值

附录
Jax-ws
网络上可用的wsdl网站
wsimport 命令
wsimport -help 用法: wsimport [options] <WSDL_URI> \其中 [options] 包括:
-b <path> 指定 jaxws/jaxb 绑定文件或附加模式
(每个 <path> 都必须具有自己的 -b)
-B<jaxbOption> 将此选项传递给 JAXB 模式编译器
-catalog <file> 指定用于解析外部实体引用的目录文件
支持 TR9401, XCatalog 和 OASIS XML 目录格式。
-d <directory> 指定放置生成的输出文件的位置
-encoding <encoding> 指定源文件所使用的字符编码
-extension 允许供应商扩展 - 不按规范
指定功能。使用扩展可能会
导致应用程序不可移植或
无法与其他实现进行互操作
-help 显示帮助
-httpproxy:<host>:<port> 指定 HTTP 代理服务器 (端口默认为 8080)
-keep 保留生成的文件
-p <pkg> 指定目标程序包
-quiet 隐藏 wsimport 输出
-s <directory> 指定放置生成的源文件的位置
-target <version> 按给定的 JAXWS 规范版本生成代码
默认为 2.2, 接受的值为 2.0, 2.1 和 2.2
例如, 2.0 将为 JAXWS 2.0 规范生成兼容的代码
-verbose 有关编译器在执行什么操作的输出消息
-version 输出版本信息
-wsdllocation <location> @WebServiceClient.wsdlLocation 值
-clientjar <jarfile> 创建生成的 Artifact 的 jar 文件以及
调用 Web 服务所需的 WSDL 元数据。
-generateJWS 生成存根 JWS 实现文件
-implDestDir <directory> 指定生成 JWS 实现文件的位置
-implServiceName <name> 生成的 JWS 实现的服务名的本地部分
-implPortName <name> 生成的 JWS 实现的端口名的本地部分 \扩展:
-XadditionalHeaders 映射标头不绑定到请求或响应消息不绑定到
Java 方法参数
-Xauthfile 用于传送以下格式的授权信息的文件:
http://username:password@example.org/stock?wsdl
-Xdebug 输出调试信息
-Xno-addressing-databinding 允许 W3C EndpointReferenceType 到 Java 的绑定
-Xnocompile 不编译生成的 Java 文件
-XdisableAuthenticator 禁用由 JAX-WS RI 使用的验证程序,
将忽略 -Xauthfile 选项 (如果设置)
-XdisableSSLHostnameVerification 在提取 wsdl 时禁用 SSL 主机名
验证 \示例:
wsimport stock.wsdl -b stock.xml -b stock.xjb
wsimport -d generated http://example.org/stock?wsdl
相关文档:
java调用WebService(未完成)记录篇的更多相关文章
- Axis2 webservice 之使用java调用webservice
在上一篇中写了一个简单了webservice,实现了一个sayHello功能.那么webservice写好之后我们如何使用Java程序来调用webservice呢? 一.java调用的webservi ...
- Java调用WebService方法总结(8)--soap.jar调用WebService
Apache的soap.jar是一种历史很久远的WebService技术,大概是2001年左右的技术,所需soap.jar可以在http://archive.apache.org/dist/ws/so ...
- Java调用WebService方法总结(6)--XFire调用WebService
XFire是codeHaus组织提供的一个WebService开源框架,目前已被Apache的CXF所取代,已很少有人用了,这里简单记录下其调用WebService使用方法.官网现已不提供下载,可以到 ...
- Java调用WebService方法总结(1)--准备工作
WebService是一种跨编程语言.跨操作系统平台的远程调用技术,已存在很多年了,很多接口也都是通过WebService方式来发布的:本系列文章主要介绍Java调用WebService的各种方法,使 ...
- Java调用webservice接口方法
java调用webservice接口 webservice的 发布一般都是使用WSDL(web service descriptive langu ...
- java 调用webservice的各种方法总结
java 调用webservice的各种方法总结 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 方法一:创建基于JAX-WS的webservice(包括 ...
- java调用webservice,restful
java调用webservice public String redoEsb(String loguid, String user, String comments, String newMsg, S ...
- 原生java调用webservice的方法,不用生成客户端代码
原生java调用webservice的方法,不用生成客户端代码 2015年10月29日 16:46:59 阅读数:1455 <span style="font-family: Aria ...
- Java调用Webservice(asmx)的几个例子
Java调用Webservice(asmx)的几个例子 2009-06-28 17:07 写了几个调用例子: 1. import org.apache.axis.client.*;import org ...
- Java调用WebService方法总结(9,end)--Http方式调用WebService
Http方式调用WebService,直接发送soap消息到服务端,然后自己解析服务端返回的结果,这种方式比较简单粗暴,也很好用:soap消息可以通过SoapUI来生成,也很方便.文中所使用到的软件版 ...
随机推荐
- java -- Stringbuild, Date, Calendar
Stringbuild类 由于String类的对象内容不可改变,每次拼接都会构建一个新的String对象,既耗时,又浪费内存空间 这时需要通过java提供的StringBuild类解决这个问题 Str ...
- 一步步制作下棋机器人之 coppeliasim进行Scara机械臂仿真与python控制
稚晖君又发布了新的机器人,很是强大. 在编写时看到了稚晖君的招聘信息,好想去试试啊! 小时候都有一个科幻梦,如今的职业也算与梦想有些沾边了.但看到稚晖君这种闪着光芒的作品,还是很是羡慕. 以前就想做一 ...
- 4.测试类mapper报错
1.总结:前几天还有今天一直在弄测试类报错的原因,想着项目是一个大整体,写一个mappe测试类,测试一个mapper,这样后面不会出错: 但是在测试mapper的时候一直,出现mapper值为空的异常 ...
- 【JSOI2008】最大值
[JSOI2008]最大值 线段树裸题!动态RMQ. 这道题的操作是直接在序列末尾添加数值,所以连\(push_{down}\),以及建树什么的都不用了.. 这真是写过的最简短的一道\(seg_{tr ...
- Vue启用报错 RangeError: Invalid typed array length: -4095
近期开发的前端项目项目启用失败,记录下修复过程 RangeError: Invalid typed array length: -4095 错误原因:node版本问题,安装10.x.x 即可 重新安装 ...
- 部署kubernetes-dashboard并配置ServiceAccount和登录鉴权
"种草" kubernetes-dashboard 安装部署dashboard 创建用于登录面板的ServiceAccount 权限控制 "种草" kubern ...
- 记一次 .NET 某外贸ERP 内存暴涨分析
一:背景 1. 讲故事 上周有位朋友找到我,说他的 API 被多次调用后出现了内存暴涨,让我帮忙看下是怎么回事?看样子是有些担心,但也不是特别担心,那既然找到我,就给他分析一下吧. 二:WinDbg ...
- Tars-Cpp 协程实现分析
作者:vivo 互联网服务器团队- Ye Feng 本文介绍了协程的概念,并讨论了 Tars Cpp 协程的实现原理和源码分析. 一.前言 Tars 是 Linux 基金会的开源项目(https:// ...
- oracle异常处理
序言 最近在工作中遇到这么一个场景: 在同一网段内存在着A库和B库,需要将A库下某些表的数据同步到B库 B库跑着定时任务,定时调用存储过程将A库下的数据同步到B库. B库和A库是通过建立dblink建 ...
- 2022-12-15:寻找用户推荐人。写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2。 对于示例数据,结果为: +------+ | name | +------+ | Wil
2022-12-15:寻找用户推荐人.写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2. 对于示例数据,结果为: ±-----+ | name | ±-----+ | Will ...