Your Site Title

Javaweb WebService

Reference

WebService

source: _posts/web/2020-12-12-web-ser.md

WSDL

WSDL(Web Service Description Language) 使用XML描述Web Service API

WSDL 文档结构

元素 定义
web service 执行的操作
web service 使用的消息
web service 使用的数据类型
web service 使用的通信协议

WSDL message

定义数据类型, portType

WSDL portType

它可描述一个web service, 可被执行的操作, 以及相关的消息

端口定义了指向某个 web service 的连接点。可以把该元素比作传统编程语言中的一个 函数库(或一个模块、或一个类),而把每个操作比作传统编程语言中的一个函数。

WSDL binding

WSDL 绑定可为 web service 定义消息格式和协议细节。

binding.name: binding名称 binding.type: type指向portType soap.binding.style: rpc-远程过程调用; document-xml soap.binding.transport: 使用的 SOAP 协议, 一般为HTTP soap.operation: 定义每个portType使用的操作符

WSDL Authentication Basic

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);

WSDL Header

  1. 实现SOAPHandler

    javax.xml.ws jaxws-api 2.3.1

    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 getHeaders() { return new TreeSet<>(); }

    }

    HelloPort port = helloService.getHelloPort(); // or something like that… BindingProvider bp = (BindingProvider)port; List handlerChain = bp.getBinding().getHandlerChain(); handlerChain.add(new DeutscheDHLHeader(USER, SIGNATURE)); bp.getBinding().setHandlerChain(handlerChain);

  2. 使用WSBindingProvider

    com.sun.xml.ws jaxws-rt 3.0.0

    还需要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 stringValue Headers.create(new QName(“simpleHeader”),”stringValue”), // create a header from JAXB object Headers.create(jaxbContext,myJaxbObject) );

  3. 修改头xmlns

     SOAPHandler.handleMessage
     envelope.removeNamespaceDeclaration
     envelope.addNamespaceDeclaration
    
  4. 修改前缀

     SOAPHandler.handleMessage
     envelope.setPrefix
     header.setPrefix
     envelope.getBody().setPrefix
    

WSDL 查看请求报文

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

SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。 或者更简单地说:SOAP 是用于访问网络服务的协议。

RPC使用HTTP交换DCOM和CORBA等对象, 会产生兼容性以及安全问题 所以就有SOAP

SOAP 语法

SOAP Envelope

必需的 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 元素可包含有关 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 Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。

SOAP Fault

SOAP Fault 元素用于存留 SOAP 消息的错误和状态信息。

faultcode:

SOAP HTTP Binding

SOAP 方法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。 HTTP + XML = SOAP SOAP 请求可能是 HTTP POST 或 HTTP GET 请求。 HTTP POST 请求规定至少两个 HTTP 头:Content-Type 和 Content-Length。

请求头:

WebService 实现

  1. Axis2
  2. CXF
  3. java-wsimport
  4. spring-WebServiceTemplate

wsimport

Java提供

类的调用顺序是根据WSDL中定义来的:

  1. service.name
  2. service.port.name 得到portType.name
  3. 调用portType.operation.name

REST

REST即表述性状态传递(英文:Representational State Transfer,简称REST)是
Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网 络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比 来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如, Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。

Jaxb

JAXB and Namespace Prefixes

Reference

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()