gpt4 book ai didi

java - 如何在 Spring 中构建 SOAP 客户端?

转载 作者:IT老高 更新时间:2023-10-28 13:44:20 24 4
gpt4 key购买 nike

我能够使用 javax.xml.soap.* 向 Web 服务发送请求,我想隐藏代码以使用 webServiceTemplate

  • 我正在努力创建请求和结果对象。 (sample Ive found 与 xml 而非 SOAP 相关)
  • 我也想知道使用有什么好处webServiceTemplate 覆盖 java.xml.soap。如果没有我做对了吗?鉴于我需要连接到 20 个网络服务。

它唯一的服务是findEvents,如下:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://ticketmaster.productserve.com/v2/soap.php" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Header/>
<soapenv:Body>
<soap:findEvents soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<request xsi:type="soap:Request">
<!--You may enter the following 7 items in any order-->
<apiKey xsi:type="xsd:string">?</apiKey>
<country xsi:type="xsd:string">?</country>
<resultsPerPage xsi:type="xsd:int">?</resultsPerPage>
<currentPage xsi:type="xsd:int">?</currentPage>
<sort xsi:type="soap:Request_Sort">
<!--You may enter the following 2 items in any order-->
<field xsi:type="xsd:string">?</field>
<order xsi:type="xsd:string">?</order>
</sort>
<filters xsi:type="soap:ArrayOfRequest_Filter" soapenc:arrayType="soap:Request_Filter[]"/>
<updatedSince xsi:type="xsd:string">?</updatedSince>
</request>
</soap:findEvents>
</soapenv:Body>
</soapenv:Envelope>

我的代码如下:

try {
SOAPConnectionFactory soapConnectionFactory =
SOAPConnectionFactory.newInstance();
SOAPConnection connection =
soapConnectionFactory.createConnection();

MessageFactory factory =
MessageFactory.newInstance();

SOAPMessage message = factory.createMessage();

SOAPHeader header = message.getSOAPHeader();
header.detachNode();

SOAPBody body = message.getSOAPBody();

SOAPFactory soapFactory =
SOAPFactory.newInstance();

Name bodyName;
bodyName = soapFactory.createName("findEvents",
"xsd", "http://ticketmaster.productserve.com/v2/soap.php");


SOAPBodyElement getList =
body.addBodyElement(bodyName);


Name childName = soapFactory.createName("findEvents");
SOAPElement eventRequest = getList.addChildElement(childName);

childName = soapFactory.createName("apiKey");
SOAPElement apiKey = eventRequest.addChildElement(childName);
apiKey.addTextNode("MYAPI");

childName = soapFactory.createName("country");
SOAPElement cid = eventRequest.addChildElement(childName);
cid.addTextNode("UK");
message.writeTo(System.out); //show message details

URL endpoint = new URL("http://ticketmaster.productserve.com/v2/soap.php");
SOAPMessage response =
connection.call(message, endpoint);

connection.close();

//SOAPBody soapBody = response.getSOAPBody();
SOAPMessage sm = response;

System.out.println("Response:");
ByteArrayOutputStream out = new ByteArrayOutputStream();
sm.writeTo(out);


String validSoap = "<?xml version=\"1.0\"?> " + out.toString();
System.out.println("It is ValidSoap: " + validSoap); //ValidSoap message

SAXBuilder builder = new SAXBuilder();
Reader in = new StringReader(validSoap); //reading character stream
Document doc = null; //empty jDom document is instantiated
doc = builder.build(in); //build the jDom document

Element root = doc.getRootElement(); //Envelope
List allChildren = root.getChildren(); //list of all its child elements
System.out.println("Root is:" + ((Element) allChildren.get(0)).getName());
listChildren(root);

} catch (Exception ex) {
ex.printStackTrace();
}

新代码

  webServiceTemplate.sendSourceAndReceiveToResult
("http://ticketmaster.productserve.com/v2/soap.php",source, result);



@XmlRootElement
public class FindEvents {
@XmlElement
Request request;

public Request getRequest() {
return request;
}

public void setRequest(Request request) {
this.request = request;
}

}

@XmlSeeAlso(SortTicket.class)
public class Request {
@XmlElement
String apiKey;
@XmlElement
String country;
@XmlElement
int resultsPerPage;
@XmlElement
int currentPage;
@XmlElement(name = "Sort")
SortTicket sort;
@XmlElement
String[] filters;
@XmlElement
String updatedSince;

public String getApiKey() {
return apiKey;
}

public void setApiKey(String apiKey) {
this.apiKey = apiKey;
}

public String getCountry() {
return country;
}

public void setCountry(String country) {
this.country = country;
}

public int getResultsPerPage() {
return resultsPerPage;
}

public void setResultsPerPage(int resultsPerPage) {
this.resultsPerPage = resultsPerPage;
}

public int getCurrentPage() {
return currentPage;
}

public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}

public SortTicket getSort() {
return sort;
}

public void setSort(SortTicket sort) {
this.sort = sort;
}

public String[] getFilters() {
return filters;
}

public void setFilters(String[] filters) {
this.filters = filters;
}

public String getUpdatedSince() {
return updatedSince;
}

public void setUpdatedSince(String updatedSince) {
this.updatedSince = updatedSince;
}

}

public class SortTicket {
@XmlElement
String field;
@XmlElement
String order;

public String getField() {
return field;
}

public void setField(String field) {
this.field = field;
}

public String getOrder() {
return order;
}

public void setOrder(String order) {
this.order = order;
}

}

最佳答案

由于您已经生成了带有 Jaxb 注释的 DTO 类,您可以创建编码器、解码器并创建 DTO 类的对象(SortTicketRequestFindEvents) 并直接发送对象而不是使用 xml 请求

webServiceTemplate.marshalSendAndReceive(findEvents);

你必须配置这样的东西。

创建编码器

<oxm:jaxb2-marshaller id="marshaller" contextPath="com.yourcontextpath" />

创建网络服务模板

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<property name="marshaller" ref="marshaller" />
<property name="unmarshaller" ref="marshaller" />
<property name="defaultUri"
value="http://ticketmaster.productserve.com/v2/soap.php" />
</bean>

在你想发送soap请求的某个类的方法中,使用@Autowired

注入(inject) webServiceTemplate
@Autowired
private WebServiceTemplate webServiceTemplate;

public void sendSampleSoapRequest() {

SortTicket sortTicket=new SortTicket();
// set its values
Request request=new Request();
//set its values
request.setSort(sortTicket);
FindEvents findEvents=new FindEvents();
setRequest(request)
Object response=webServiceTemplate.marshalSendAndReceive(findEvents);
}

marshalSendAndReceive 消息使用 Jaxb 编码器将您的对象(标有 JaxB 注释)转换为 xml。因此,您的 findEvents 对象将被转换为它的 xml。

关于你的第二点使用 webServiceTemplate 优于 java.xml.soap 的优势。 :您不必手动创建那些 SOAPElement,您只需创建一个对象并发送它,而不是手动处理它的大代码。由于您必须连接到 20 个不同的 Web 服务,因此您可以更轻松地创建 DTO 对象并直接发送它们。您可能需要稍微修改我上面的示例。可能会删除默认 uri

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<property name="marshaller" ref="marshaller" />
<property name="unmarshaller" ref="marshaller" />
</bean>

在发送请求时给出 URI 请求

Object response=webServiceTemplate.marshalSendAndReceive(uri,object);

用于发送到多个服务器

Object response1=webServiceTemplate.marshalSendAndReceive(uri1,object);
Object response1=webServiceTemplate.marshalSendAndReceive(uri2,object)

uri1 和uri2 可以是不同的soap 服务如果你没有wsdl 你可以用这个方法发送xml

sendSourceAndReceiveToResult(uri1,source, result);
sendSourceAndReceiveToResult(uri2,source, result);

send 方法中发送 uri 会覆盖默认 URI

例如检查 this还要检查 api doc

关于java - 如何在 Spring 中构建 SOAP 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30845148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com