【问题标题】:Writing a SOAP Client in Java用 Java 编写 SOAP 客户端
【发布时间】:2013-11-28 06:48:59
【问题描述】:

我用 Java 编写了一个自定义 SOAP 客户端,虽然它可以工作,但我觉得我编写它的方式非常初级。我不擅长 OOP,如您所见,所有工作都在一个班级中完成。您能否帮助改进这一点或提供任何想法。

我读过关于创建soap客户端的文章,例如this,我可以说课程组织得很好。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;

import org.w3c.dom.Document;

public class ConInfoService {
private final static String BLANK = "";
    private final static String SOAP_SERVER = "http://server.com/ConInfoService.asmx";
    private final static String PREFIX_XSI = "xsi"; 
    private final static String PREFIX_XSD = "xsd"; 
    private final static String PREFIX_SOAP = "soap";
    private final static String URI_HOST = "server.com";
    private final static String URI_GETCULIST = "http://tempuri.org/GetCuList";
    private final static String URI_XSI = "http://www.w3.org/1999/XMLSchema-instance";
    private final static String URI_XSD = "http://www.w3.org/1999/XMLSchema";
    private final static String URI_SOAP = "http://schemas.xmlsoap.org/soap/envelope/";
    private final static String URI_TEMPURI = "http://tempuri.org/";
    private final static String HEADER_HOST = "Host";
    private final static String HEADER_SOAPACTION = "SOAPAction";

    public SOAPMessage getCuList(Date asDate,  String asConAvailable, String asConChanged, String asMso) throws Exception {
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection soapConnection = soapConnectionFactory.createConnection();

            String soapServer = SOAP_SERVER;;
            SOAPMessage soapMessage = createSOAPRequest(asDate, asConAvailable, asConChanged, asMso);
            return soapConnection.call(soapMessage, soapServer);
    }

    private static SOAPMessage createSOAPRequest(Date asDate,  String asConAvailable, String asConChanged, String asMso) throws Exception {
        if (asDate != null && asConAvailable != null && asConChanged != null && asMso != null) {
            MessageFactory messageFactory = MessageFactory.newInstance();
            SOAPMessage soapMessage = messageFactory.createMessage();
            SOAPPart soapPart = soapMessage.getSOAPPart();

            SOAPEnvelope envelope = soapPart.getEnvelope();
            envelope.addNamespaceDeclaration(PREFIX_XSI, URI_XSI);
            envelope.addNamespaceDeclaration(PREFIX_XSD, URI_XSD);
            envelope.addNamespaceDeclaration(PREFIX_SOAP, URI_SOAP);

            SOAPBody soapBody = envelope.getBody();
            SOAPElement getCuListElem = soapBody.addChildElement("GetCuList", BLANK, URI_TEMPURI);
            SOAPElement asDateElem = getCuListElem.addChildElement("asDate", BLANK);
            SOAPElement asConAvailableElem = getCuListElem.addChildElement("asConAvailable", BLANK);
            SOAPElement asConChangedElem = getCuListElem.addChildElement("asConChanged", BLANK);
            SOAPElement asMsoElem = getCuListElem.addChildElement("asMso", BLANK);      

            asDateElem.addTextNode(formatDate(asDate));
            asConAvailableElem.addTextNode(asConAvailable.trim());
            asConChangedElem.addTextNode(asConChanged.trim());
            asMsoElem.addTextNode(asMso.trim());

            MimeHeaders headers = soapMessage.getMimeHeaders();
            headers.addHeader(HEADER_HOST, URI_HOST);
            headers.addHeader(HEADER_SOAPACTION, URI_GETCULIST);

            soapMessage.saveChanges();

            return soapMessage;
        }

        return null;
    }
}

【问题讨论】:

    标签: java soap-client


    【解决方案1】:

    为什么不使用 JAX-WS/JAXB 来生成基于 wsdl 的类?比如this或者this

    【讨论】:

    • 我支持使用 JAX-WS 实现(或内置于 JDK 本身的实现)。如果不是为了易于使用,JAX-WS 和 JAXB 的文档就非常精彩!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2019-08-21
    • 2011-07-28
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    相关资源
    最近更新 更多