一、调用ASP.NET发布的WebService服务
以下是SOAP1.2请求事例
POST /user/yfengine.asmx HTTP/1.1
Host: oserver.palm-la.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
xml version="1.0" encoding="utf-8" ?>
< soap12:Envelope xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" xmlns:soap12 ="http://www.w3.org/2003/05/soap-envelope" >
< soap12:Body >
< Login xmlns ="Loginnames" >
< userId > string userId >
< password > string password >
Login >
soap12:Body >
soap12:Envelope >
Host: oserver.palm-la.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
xml version="1.0" encoding="utf-8" ?>
< soap12:Envelope xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" xmlns:soap12 ="http://www.w3.org/2003/05/soap-envelope" >
< soap12:Body >
< Login xmlns ="Loginnames" >
< userId > string userId >
< password > string password >
Login >
soap12:Body >
soap12:Envelope >
1、方式一:通过AXIS调用
String serviceEpr = "http://127.0.0.1/rightproject/WebServices/RightService.asmx";
public
String callWebServiceByAixs(String userId, String password, String serviceEpr){
try {
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress( new java.net.URL(serviceEpr));
// 服务名
call.setOperationName( new QName( " http://tempuri.org/ " , " Login " ));
// 定义入口参数和参数类型
call.addParameter( new QName( " http://tempuri.org/ " , " userId " ),XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( new QName( " http://tempuri.org/ " , " password " ),XMLType.XSD_STRING, ParameterMode.IN);
call.setUseSOAPAction( true );
// Action地址
call.setSOAPActionURI( " http://tempuri.org/Login " );
// 定义返回值类型
call.setReturnType(XMLType.XSD_INT);
// 调用服务获取返回值
String result = String.valueOf(call.invoke( new Object[]{userId, password}));
System.out.println( " 返回值 : " + result);
return result;
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null ;
}
try {
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress( new java.net.URL(serviceEpr));
// 服务名
call.setOperationName( new QName( " http://tempuri.org/ " , " Login " ));
// 定义入口参数和参数类型
call.addParameter( new QName( " http://tempuri.org/ " , " userId " ),XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter( new QName( " http://tempuri.org/ " , " password " ),XMLType.XSD_STRING, ParameterMode.IN);
call.setUseSOAPAction( true );
// Action地址
call.setSOAPActionURI( " http://tempuri.org/Login " );
// 定义返回值类型
call.setReturnType(XMLType.XSD_INT);
// 调用服务获取返回值
String result = String.valueOf(call.invoke( new Object[]{userId, password}));
System.out.println( " 返回值 : " + result);
return result;
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null ;
}
2、方式二: 通过HttpClient调用webservice
soapRequest 为以下Xml,将请求的入口参数输入
xml version="1.0" encoding="utf-8"
?>
< soap12:Envelope xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" xmlns:soap12 ="http://www.w3.org/2003/05/soap-envelope" >
< soap12:Body >
< Login xmlns ="Loginnames" >
< userId > 张氏 userId >
< password > 123456 password >
Login >
soap12:Body >
soap12:Envelope >
< soap12:Envelope xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" xmlns:soap12 ="http://www.w3.org/2003/05/soap-envelope" >
< soap12:Body >
< Login xmlns ="Loginnames" >
< userId > 张氏 userId >
< password > 123456 password >
Login >
soap12:Body >
soap12:Envelope >
String serviceEpr = "http://127.0.0.1/rightproject/WebServices/RightService.asmx";
String contentType = "application/soap+xml; charset=utf-8";
public
static
String callWebService(String soapRequest, String serviceEpr, String contentType){
PostMethod postMethod = new PostMethod(serviceEpr);
// 设置POST方法请求超时
postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000 );
try {
byte [] b = soapRequest.getBytes( " utf-8 " );
InputStream inputStream = new ByteArrayInputStream(b, 0 , b.length);
RequestEntity re = new InputStreamRequestEntity(inputStream, b.length, contentType);
postMethod.setRequestEntity(re);
HttpClient httpClient = new HttpClient();
HttpConnectionManagerParams managerParams = httpClient.getHttpConnectionManager().getParams();
// 设置连接超时时间(单位毫秒)
managerParams.setConnectionTimeout( 30000 );
// 设置读数据超时时间(单位毫秒)
managerParams.setSoTimeout( 600000 );
int statusCode = httpClient.executeMethod(postMethod);
if (statusCode != HttpStatus.SC_OK)
throw new IllegalStateException( " 调用webservice错误 : " + postMethod.getStatusLine());
String soapRequestData = postMethod.getResponseBodyAsString();
inputStream.close();
return soapRequestData;
} catch (UnsupportedEncodingException e) {
return " errorMessage : " + e.getMessage();
} catch (HttpException e) {
return " errorMessage : " + e.getMessage();
} catch (IOException e) {
return " errorMessage : " + e.getMessage();
} finally {
postMethod.releaseConnection();
}
}
PostMethod postMethod = new PostMethod(serviceEpr);
// 设置POST方法请求超时
postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000 );
try {
byte [] b = soapRequest.getBytes( " utf-8 " );
InputStream inputStream = new ByteArrayInputStream(b, 0 , b.length);
RequestEntity re = new InputStreamRequestEntity(inputStream, b.length, contentType);
postMethod.setRequestEntity(re);
HttpClient httpClient = new HttpClient();
HttpConnectionManagerParams managerParams = httpClient.getHttpConnectionManager().getParams();
// 设置连接超时时间(单位毫秒)
managerParams.setConnectionTimeout( 30000 );
// 设置读数据超时时间(单位毫秒)
managerParams.setSoTimeout( 600000 );
int statusCode = httpClient.executeMethod(postMethod);
if (statusCode != HttpStatus.SC_OK)
throw new IllegalStateException( " 调用webservice错误 : " + postMethod.getStatusLine());
String soapRequestData = postMethod.getResponseBodyAsString();
inputStream.close();
return soapRequestData;
} catch (UnsupportedEncodingException e) {
return " errorMessage : " + e.getMessage();
} catch (HttpException e) {
return " errorMessage : " + e.getMessage();
} catch (IOException e) {
return " errorMessage : " + e.getMessage();
} finally {
postMethod.releaseConnection();
}
}
二、调用其他WebService服务
1、方式一:通过AIXS2调用
serviceEpr:服务地址
nameSpace:服务命名空间
methodName:服务名称
Object[] args = new Object[]{"请求的数据"};
DataHandler dataHandler = new DataHandler(new FileDataSource("文件路径"));
传文件的话,"请求的数据"可以用DataHandler对象,但是WebService服务需提供相应的处理即:
InputStream inputStream = DataHandler.getInputStream();
然后将inputStream写入文件即可。
还可以将文件读取为二进制流进行传递。
public
static
String callWebService(String serviceEpr, String nameSpace, Object[] args, String methodName){
try {
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(serviceEpr);
options.setTo(targetEPR);
// ===========可以解决多次调用webservice后的连接超时异常========
options.setManageSession( true );
options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, true );
// 设置超时
options.setTimeOutInMilliSeconds( 60000L );
// 设定操作的名称
QName opQName = new QName(nameSpace, methodName);
// 设定返回值
// 操作需要传入的参数已经在参数中给定,这里直接传入方法中调用
Class[] opReturnType = new Class[] { String[]. class };
// 请求并得到返回值
Object[] response = serviceClient.invokeBlocking(opQName, args, opReturnType);
String sResult = ((String[]) response[ 0 ])[ 0 ];
// ==========可以解决多次调用webservice后的连接超时异常=======
serviceClient.cleanupTransport();
return sResult;
} catch (AxisFault af){
return af.getMessage();
}
}
try {
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(serviceEpr);
options.setTo(targetEPR);
// ===========可以解决多次调用webservice后的连接超时异常========
options.setManageSession( true );
options.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, true );
// 设置超时
options.setTimeOutInMilliSeconds( 60000L );
// 设定操作的名称
QName opQName = new QName(nameSpace, methodName);
// 设定返回值
// 操作需要传入的参数已经在参数中给定,这里直接传入方法中调用
Class[] opReturnType = new Class[] { String[]. class };
// 请求并得到返回值
Object[] response = serviceClient.invokeBlocking(opQName, args, opReturnType);
String sResult = ((String[]) response[ 0 ])[ 0 ];
// ==========可以解决多次调用webservice后的连接超时异常=======
serviceClient.cleanupTransport();
return sResult;
} catch (AxisFault af){
return af.getMessage();
}
}
2、方式二:
serviceEpr:服务器地址
nameSpace:服务命名空间
methodName:服务名称
methodName:服务名称
private
static
void
callWebService(String serviceEpr, String nameSpace, String methodName) {
try {
EndpointReference endpointReference = new EndpointReference(serviceEpr);
// 创建一个OMFactory,下面的namespace、方法与参数均需由它创建
OMFactory factory = OMAbstractFactory.getOMFactory();
// 创建命名空间
OMNamespace namespace = factory.createOMNamespace(nameSpace, " urn " );
// 参数对数
OMElement nameElement = factory.createOMElement( " arg0 " , null );
nameElement.addChild(factory.createOMText(nameElement, " 北京 " ));
// 创建一个method对象
OMElement method = factory.createOMElement(methodName, namespace);
method.addChild(nameElement);
Options options = new Options();
// SOAPACTION
// options.setAction("sayHi");
options.setTo(endpointReference);
options.setSoapVersionURI(org.apache.axiom.soap.SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
// 请求并得到结果
OMElement result = sender.sendReceive(method);
System.out.println(result.toString());
} catch (AxisFault ex) {
ex.printStackTrace();
}
}
try {
EndpointReference endpointReference = new EndpointReference(serviceEpr);
// 创建一个OMFactory,下面的namespace、方法与参数均需由它创建
OMFactory factory = OMAbstractFactory.getOMFactory();
// 创建命名空间
OMNamespace namespace = factory.createOMNamespace(nameSpace, " urn " );
// 参数对数
OMElement nameElement = factory.createOMElement( " arg0 " , null );
nameElement.addChild(factory.createOMText(nameElement, " 北京 " ));
// 创建一个method对象
OMElement method = factory.createOMElement(methodName, namespace);
method.addChild(nameElement);
Options options = new Options();
// SOAPACTION
// options.setAction("sayHi");
options.setTo(endpointReference);
options.setSoapVersionURI(org.apache.axiom.soap.SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
// 请求并得到结果
OMElement result = sender.sendReceive(method);
System.out.println(result.toString());
} catch (AxisFault ex) {
ex.printStackTrace();
}
}
3、方式三:通过CXF调用
serviceEpr:服务器地址
nameSpace:服务命名空间
methodName:服务名称
nameSpace:服务命名空间
methodName:服务名称
public
static
String callWebService(String serviceEpr, String nameSpace, String methodName){
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
Client client = clientFactory.createClient(serviceEpr);
Object[] resp = client.invoke(methodName, new Object[]{ " 请求的内容 " });
System.out.println(resp[ 0 ]);
}
// 传文件,将文件读取为二进制流进行传递,“请求内容”则为二进制流
private byte [] getContent(String filePath) throws IOException{
FileInputStream inputStream = new FileInputStream(filePath);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( 1024 );
System.out.println( " bytes available: " + inputStream.available());
byte [] b = new byte [ 1024 ];
int size = 0 ;
while ((size = inputStream.read(b)) != - 1 )
outputStream.write(b, 0 , size);
inputStream.close();
byte [] bytes = outputStream.toByteArray();
outputStream .close();
return bytes;
}
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
Client client = clientFactory.createClient(serviceEpr);
Object[] resp = client.invoke(methodName, new Object[]{ " 请求的内容 " });
System.out.println(resp[ 0 ]);
}
// 传文件,将文件读取为二进制流进行传递,“请求内容”则为二进制流
private byte [] getContent(String filePath) throws IOException{
FileInputStream inputStream = new FileInputStream(filePath);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( 1024 );
System.out.println( " bytes available: " + inputStream.available());
byte [] b = new byte [ 1024 ];
int size = 0 ;
while ((size = inputStream.read(b)) != - 1 )
outputStream.write(b, 0 , size);
inputStream.close();
byte [] bytes = outputStream.toByteArray();
outputStream .close();
return bytes;
}