需求:web项目下要新增一个定时发短信功能,客户方给提供了一个WebService短信接口。
1、如何请求WebService短信接口?
最快速还不会出很大技术问题的方式:就是根据接口文档中提供wsdl链接,进入到链接,将链接页面以wsdl保存到本地,然后在项目中生成客户端代码。
2、这样的好处:可以直接创建对象,然后调用你需要的方法。
3、步骤:Eclipse中,项目右击New->Web Service Client->Service definition:选择你保存到本地的wsdl文件->Finish(还待亲测,因为客户给提供的WebService短信接口中有一个接口样例,我是直接把示例的src下的package直接复制一份到我的web项目的src下面的。)
4、可能需要的jar包:axis.jar、axis-ant.jar、commons-discovery-0.2.jar、commons-logging-1.0.4.jar、jaxrpc.jar、log4j-1.2.8.jar、saaj.jar、wsdl4j-1.5.1.jar(样例中给的,我也是直接拿到我的lib文件夹中的,你是否需要就要具体问题具体分析)
5、推荐一个下载jar包的好地方:搜索Maven仓库
6、踩的坑:刚开始我企图在网上找到一个请求webservice接口的方法,看网上说是RPC方式,我没试成功,需要一堆的axis2.jar包,奇奇怪怪的错误,大多是缺少jar包导致的。(代码如下,或许可行吧,只是我比较菜,没解决)
public class MessageClient {
public void sendMessage(String json) {
try {
String url = "http://IP地址:端口号/***/***/Sms***";
String method = "sendSms";
Object[] requestParam = new Object[] {json};
RPCServiceClient serviceClient = new RPCServiceClient();
//1、指定调用的WebService的URL
EndpointReference target = new EndpointReference(url);
Options options = serviceClient.getOptions();
options.setTo(target);
options.setProperty(HTTPConstants.CHUNKED, false);
//2、指定方法返回值的数据类型的Class对象
Class[] responseParam = new Class[] {String.class};
//3、指定要调用的方法及WSDL文件的命名空间
QName requestMethod = new QName("http://sendmessage.com",method);
//4、调用方法并输出该方法的返回值
String result = (String)serviceClient.invokeBlocking(requestMethod, requestParam, responseParam)[0];
System.out.println(result);//返回的xml
//5、将返回值JSON字符串转为JSON对象
JSONObject rsObject = JSONObject.fromObject(result);
if(rsObject.getInt("errMsg") < 0) {
ARE.getLog(this.getClass()).info("手机号:"+rsObject.getJSONObject("sendResMsg").getString("Phone")+"的用户,短信发送失败");
}else {
ARE.getLog(this.getClass()).info("手机号:"+rsObject.getJSONObject("sendResMsg").getString("Phone")+"的用户,短信发送成功");
}
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
ARE.getLog(this.getClass()).debug("短信发送异常");
}
}*/
}