source: _posts/web/2020-12-12-web-ser.md
WSDL(Web Service Description Language) 使用XML描述Web Service API
| 元素 | 定义 |
|---|---|
| web service 执行的操作 | |
| web service 使用的消息 | |
| web service 使用的数据类型 | |
| web service 使用的通信协议 |
定义数据类型, portType
它可描述一个
web service, 可被执行的操作, 以及相关的消息端口定义了指向某个 web service 的连接点。可以把该元素比作传统编程语言中的一个 函数库(或一个模块、或一个类),而把每个操作比作传统编程语言中的一个函数。
WSDL 绑定可为 web service 定义消息格式和协议细节。
binding.name: binding名称
binding.type: type指向portType
soap.binding.style: rpc-远程过程调用; document-xml
soap.binding.transport: 使用的 SOAP 协议, 一般为HTTP
soap.operation: 定义每个portType使用的操作符
1.
Service s = new Service();
Port port = s.getPort();
BindingProvider prov = (BindingProvider)port;
prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myusername");
prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword");
port.call();
2.
Authenticator myAuth = new Authenticator()
{
@Override
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("german", "german".toCharArray());
}
};
Authenticator.setDefault(myAuth);
实现SOAPHandler
import java.util.Set; import java.util.TreeSet;
import javax.xml.namespace.QName; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPHeaderElement; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext;
public class DeutscheDHLHeader implements SOAPHandler
private String user; private String signature;
public DeutscheDHLHeader(String user, String signature) { this.user = user; this.signature = signature; }
@Override public boolean handleMessage(SOAPMessageContext context) { try { SOAPEnvelope envelope = context.getMessage().getSOAPPart().getEnvelope(); SOAPHeader header = envelope.getHeader(); if (header == null) { header = envelope.addHeader(); } SOAPHeaderElement headerElement = header.addHeaderElement(envelope.createName(“Authentification”, “cis”, “http://dhl.de/webservice/cisbase”)); SOAPElement userElement = headerElement.addChildElement(“user”, “cis”, “http://dhl.de/webservice/cisbase”); userElement.addTextNode(user); SOAPElement signElement = headerElement.addChildElement(“signature”, “cis”, “http://dhl.de/webservice/cisbase”); signElement.addTextNode(signature); headerElement.addChildElement(userElement); headerElement.addChildElement(signElement); } catch (Exception e) { e.printStackTrace(); } return true; }
@Override public boolean handleFault(SOAPMessageContext context) { return false; }
@Override public void close(MessageContext context) { }
@Override
public Set
}
HelloPort port = helloService.getHelloPort(); // or something like that…
BindingProvider bp = (BindingProvider)port;
List
使用WSBindingProvider
还需要com.oracle.webservices.wls.jaxws-wlswss-client.jar
HelloPort port = helloService.getHelloPort(); // or something like that… BindingProvider bp = (BindingProvider)port;
bp.setOutboundHeader(
// simple string value as a header, like
修改头xmlns
SOAPHandler.handleMessage
envelope.removeNamespaceDeclaration
envelope.addNamespaceDeclaration
修改前缀
SOAPHandler.handleMessage
envelope.setPrefix
header.setPrefix
envelope.getBody().setPrefix
System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold", "999999");
SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。 或者更简单地说:SOAP 是用于访问网络服务的协议。
RPC使用HTTP交换DCOM和CORBA等对象, 会产生兼容性以及安全问题 所以就有SOAP
必需的 SOAP 的 Envelope 元素是 SOAP 消息的根元素。它可把 XML 文档定义为 SOAP 消息。
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
可选的 SOAP Header 元素可包含有关 SOAP 消息的应用程序专用信息(比如认证、支付等) 。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。
<soap:Header>
<m:Trans
xmlns:m="http://www.w3school.com.cn/transaction/"
soap:mustUnderstand="1">234</m:Trans>
</soap:Header>
必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。
SOAP Fault 元素用于存留 SOAP 消息的错误和状态信息。
faultcode:
SOAP 方法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。 HTTP + XML = SOAP SOAP 请求可能是 HTTP POST 或 HTTP GET 请求。 HTTP POST 请求规定至少两个 HTTP 头:Content-Type 和 Content-Length。
请求头:
Java提供
-encoding 编码
wsimport -s ~/Downloads -d ~/Downloads/class/ -p com.equick.equickorder.integration.wsdl.correios -encoding utf-8 http://webservice.correios.com.br/service/rastro/Rastro.wsdl
类的调用顺序是根据WSDL中定义来的:
REST即表述性状态传递(英文:Representational State Transfer,简称REST)是
Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网 络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比 来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如, Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。
Web Services Description Language (WSDL) 1.1
Simple Object Access Protocol (SOAP) 1.1
What is REST
Axis,axis2,Xfire以及cxf对比
Difference between Axis2 webservice and CXF web service
Springboot 集成 webservice Client
WebXml
WS-REST
RESTful API 设计指南
Java Code Examples for javax.xml.soap.SOAPEnvelope#addHeader()