Wie Baue SOAP-client in den Frühling?
Bin ich in der Lage zum senden von Anfragen an den web service mit javax.xml.soap.*
möchte ich verdeckte den code zu verwenden webServiceTemplate
.
- Ich habe Schwierigkeiten mit dem erstellen von Anfrage-und Ergebnis-Objekte. (Beispiel Ive gefunden ist verwandt mit xml nicht SOAP)
- Ich bin auch gefragt, ob es irgendwelche Vorteile bei der Verwendung
webServiceTemplate
überjava.xml.soap
. Wenn nicht mache ich es richtig? Gegeben, die ich brauche, um verbunden zu 20 web-services.
Der einzige Dienst, der es hat, ist findEvents
wie folgt:
<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>
Mein code ist wie folgt:
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();
}
Neuen Code
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;
}
}
- vielleicht ist diese Frage eignet sich besser für die codereview?
- okay vielen Dank für Ihren Vorschlag, ich habe gerade gebucht auf code review sowie codereview.stackexchange.com/questions/95633/...
- Es sieht nicht ganz on-topic. Werden Sie sicher, dass Sie gelesen habe, Code-Review-Hilfe-Center.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie generiert haben, DTO-Klassen mit Jaxb-annotation-erstellen Sie eine marshaller ,unmarshaller und Objekte erstellen, die von der DTO-Klassen (
SortTicket
,Request
,FindEvents
) und senden Sie die Objekte, sondern direkt mit dem xml-requestEtwas wie das Sie konfigurieren werden.
Erstellen Sie ein marshaller
erstellen Sie web-service-Vorlage
und in einigen Klassen die Methode, wo Sie wollen, um das senden von soap-Anfrage injizieren
webServiceTemplate
mit@Autowired
marshalSendAndReceive
Nachricht wird mit Jaxb marshaller konvertieren Sie Ihre Objekte (markiert mit JaxB annotation)zu xml.So über IhrefindEvents
Objekt in seine xml aus.Bezüglich deiner zweiten Punkt
Vorteile der Verwendung von
webServiceTemplate
über java.xml.Seife. : Sie müssen nicht erstellen die SOAPElements manuell erstellen Sie einfach ein Objekt aus und senden Sie es anstelle von großen code für das manuelle handling.Da müssen Sie eine Verbindung zu 20 verschiedene web-Dienste es wird viel einfacher für Sie zu erstellen DTO-Objekte und senden Sie Sie direkt.Sie müssen möglicherweise ändern sich meine oben genannten Beispiele ein wenig.Möglicherweise entfernen Sie den deault uri
und beim senden der Anfrage geben Sie die URI-Anfrage
Versenden mehrere server
uri1 und uri2 können verschiedene soap-Dienst Und wenn Sie nicht die wsdl senden Sie xml mit dieser Methode
Senden eines uri in der senden Methode über Fahrten der Standard-URI -
Beispielsweise überprüfen diese auch überprüfen Sie die api - doc
Object response1=webServiceTemplate.marshalSendAndReceive(uri1,object);
Object response1=webServiceTemplate.marshalSendAndReceive(uri2,object)
uri1 und uri2 können verschiedene soap-Dienst Und wenn Sie nicht die wsdl senden Sie xml mit dieser MethodesendSourceAndReceiveToResult(uri1,source, result);
sendSourceAndReceiveToResult(uri2,source, result);
Es hängt von Ihren Anforderungen müssen Sie code schreiben, der Logik, je nach Ihrem Bedarf.