[英]How to get response from SOAP endpoint in java?
我是SOAP的新手,所以一直在網上尋找一些程序,這是我想出的,但是我得到的響應為空,一定是一些愚蠢的事情,但幾乎不需要幫助
請在下面查看我的代碼和輸出。 謝謝
碼
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;
public class AtomicNumber {
public static void main(String[] args) {
try {
SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance();
SOAPConnection connection = sfc.createConnection();
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage smsg = mf.createMessage();
SOAPHeader shead = smsg.getSOAPHeader();
SOAPBody sbody = smsg.getSOAPBody();
shead.detachNode();
QName bodyName = new QName("http://www.webserviceX.NET", "GetAtomicNumber", "web");
SOAPBodyElement bodyElement = sbody.addBodyElement(bodyName);
QName qn = new QName("ElementName");
SOAPElement quotation = bodyElement.addChildElement(qn);
quotation.addTextNode("iron");
System.out.println("\n Soap Request:\n");
smsg.writeTo(System.out);
System.out.println();
URL endpoint = new URL("http://www.webservicex.net/periodictable.asmx");
SOAPMessage response = connection.call(smsg, endpoint);
System.out.println("\n Soap Response:\n");
System.out.println(response.getContentDescription());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
我的輸出
Soap Request:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><web:GetAtomicNumber xmlns:web="http://www.webserviceX.NET"><ElementName>sodium</ElementName></web:GetAtomicNumber></SOAP-ENV:Body></SOAP-ENV:Envelope>
Soap Response:
null
更新
這就是我得到的(異常)
<faultcode>soap:Server</faultcode>
<faultstring>System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Data.SqlClient.SqlException: Procedure or function 'GetAtomicNumber' expects parameter '@ElementName', which was not supplied.
at WebServicex.periodictable.GetAtomicNumber(String ElementName)
--- End of inner exception stack trace ---</faultstring>
您要做的是為此Web服務自動生成Java代碼。 WSDL在這里: http : //www.webservicex.net/periodictable.asmx?wsdl
在Java中,用於自動生成代碼的工具是wsimport
。 您將要使用以下內容:
wsimport http://www.webservicex.net/periodictable.asmx?wsdl -p com.company.whateveruwant -Xnocompile -d . -keep
這會將所需的代碼放入指定的程序包(在此處com.company.whateveruwant
)。
從那里開始,您只需要像普通的Java庫一樣簡單地調用SOAP方法即可:
PeriodictableSoap soap = new Periodictable().getPeriodictableSoap();
System.out.println(soap.getAtomicNumber("Iron"));
打印輸出:
<NewDataSet>
<Table>
<AtomicNumber>26</AtomicNumber>
<ElementName>Iron</ElementName>
<Symbol>Fe</Symbol>
<AtomicWeight>55.847</AtomicWeight>
<BoilingPoint>3300</BoilingPoint>
<IonisationPotential>7.9</IonisationPotential>
<EletroNegativity>1.6400000000000001</EletroNegativity>
<AtomicRadius>1.17</AtomicRadius>
<MeltingPoint>1808</MeltingPoint>
<Density>7874</Density>
</Table>
</NewDataSet>
試試看
QName qn = new QName("http://www.webserviceX.NET","ElementName","web");
編輯:此外,正如其他人所建議的-您將在這里使用生成的客戶端代碼更好-Axis,JAX-WS等都是選擇。
正確的代碼應如下所示。
QName bodyName = new QName("http://www.webserviceX.NET", "GetAtomicNumber");
SOAPBodyElement bodyElement = sbody.addBodyElement(bodyName);
QName qn = new QName("ElementName");
您是否真的需要使用裸露的SOAP類? 如何生成JAX-WS工件以擺脫所有這些樣板?
在此處了解更多信息(並入ANT)。
使用cxf-codegen-plugin maven插件,您可以通過添加以下依賴項來快速創建soap服務的客戶端:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-core</artifactId>
<version>2.4.2</version>
</dependency>
並添加以下構建部分:
org.apache.cxf cxf-codegen-plugin 2.1.2 generate-sources generate-sources wsdl2java $ {basedir} / target / generated-sources / cxf $ {basedir} /src/main/resources/wsdlfile.wsdl -client -wsdlLocation -p com.package.for.generated.classes
然后在$ {basedir} / target / generated-sources / cxf中,您將具有調用Web服務所需的類以及如何執行此操作的示例。
希望能幫助到你!
@Ricky,這是正確的代碼。
SOAPBody body = message.getSOAPBody();
QName bodyName = new QName("http://www.webserviceX.NET", "GetAtomicNumber");
SOAPBodyElement bodyElement = body.addBodyElement(bodyName);
SOAPElement symbol = bodyElement.addChildElement("MyMetal");
symbol.addTextNode("iron");
SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();
SOAPMessage response = connection.call(message, endpoint);
connection.close();
message.writeTo(System.out);
System.out.println();
response.writeTo(System.out);
System.out.println();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.