![](/img/trans.png)
[英]JAX-WS :: ways to call a web service from a standalone Java 7 SE client
[英]Call web service method from Java SE program
如何從Java桌面客戶端調用Web服務方法。 基本上我的Java程序在啟用Internet的桌面上運行。 我的網絡服務網址是例如。 localhost:8090/Service.svc
,此Web服務基本上是將數據存儲在數據庫中,我們只需要調用Web服務方法並傳遞xml字符串作為參數即可。
public static void main(String [] args)
{
String accessURL,method, parameters[];
try {
String xml = "<DocumentElement>"
+ "<Table1>"
+ "<ConsumptionID>0</ConsumptionID>"
+ "<ConsumptionDate>2012/01/01 00:00:00</ConsumptionDate>"
+ "<MeterNumber>99999901</MeterNumber>"
+ "<Voltage>200</Voltage>"
+ "<Ampere>50</Ampere>"
+ "<PowerFactor>0.91</PowerFactor>"
+ "<KiloWatt>8525</KiloWatt>"
+ "<HourValue>3</HourValue>"
+ "<EndKiloWattHour>5841</EndKiloWattHour>"
+ "<KVA>1000</KVA>"
+ "<ClientID>1011</ClientID>"
+ "<CreatedBy>1</CreatedBy>"
+ "</Table1>"
+ "</DocumentElement>";
accessURL = "http://localhost:8090/Service.svc";
method = "Save_Consumption";
parameters = new String[1];
parameters[0] = xml;
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new java.net.URL(accessURL));
call.setOperationName(method);
Object[] params = new Object[parameters.length];
params[0]=(Object)(parameters[0]);
String retval = (String)call.invoke(params);
System.out.println("Operation Result: " + retval);
} catch(Exception e) {
System.err.println(e.toString());
e.printStackTrace();
}
}
run:
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
AxisFault
faultCode: {http://schemas.microsoft.com/ws/2005/05/addressing/none}ActionNotSupported
faultSubcode:
faultString: The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1741)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2898)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:302)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at com.lmeasure.utils.HelloClient.main(HelloClient.java:54)
{http://xml.apache.org/axis/}hostname:eeipldt0132
The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1741)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2898)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:302)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at com.lmeasure.utils.HelloClient.main(HelloClient.java:54)
誰能知道這有什么問題,或者提供任何好的教程/工作示例來解決我的問題?
問題似乎是您沒有發布適當的XML。 對於SOAP服務,手工處理SOAP消息非常困難。 您應該讓Axis為您執行此操作。
對於初學者,您將使用服務WSDL。 這是XML模式中的服務定義。
一旦有了WSDL,就可以生成客戶端存根。 存根允許您使用Java對象而不是XML來構建客戶端請求。
您可以使用wsdltojava工具在Axis中執行此操作 。 以下是文檔: http : //axis.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL 。
這是一個示例: http : //www.digizol.com/2008/07/web-service-axis-tutorial-client-server.html
您可以嘗試使用JDK 6中的wsimport
工具來獲取WebService的客戶端。 該工具生成可在proyect中使用的Java代碼。 為此,您需要WSDL文件。
您可以嘗試下一個命令:
wsimport http://localhost:8090/Service.svc?wsdl -s C:\sources -Xnocompile
您可以將generate類用於調用WebService之類的東西:
ExampleService exampleService = new ExampleService();
Example example = exampleService.getExamplePort();
ReturnValue rv = example.doSomething(param);
通過這種方式,您不需要其他庫。
您可以在使用Java 6和JAX-WS使用Web服務中找到一個很好的例子。
看起來應該在名稱為“ SOAPAction”的HTTP標頭中設置方法名稱“ Save_Consumption”。
我不熟悉Service和Call方法,但是使用普通的舊HttpURLConnection API,它將是:
URL httpUrl = new URL(accessUrl);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
connection.addRequestProperty("SOAPAction", soapAction);
就像其他張貼者所說的那樣,您可以使用wsimport命令,但是根據我的經驗,這是心臟病發作的創可貼。 很好,您可以嘗試並嘗試!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.