一、调用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
>
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
;
}
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
>
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();
}
}
二、调用其他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();
}
}
2、方式二:
serviceEpr:服务器地址
nameSpace:服务命名空间
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();
}
}
3、方式三:通过CXF调用
serviceEpr:服务器地址
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;
}