工作需要,与电信做彩信接口,使用webservice,需要发送附件,认证信息放置于请求头中。
其中,附件DataHandler是作为附件发送,而不是作为某个请求参数发送。
这块东西研究了几天,总算是可以发送了,测试了下接收,也是ok的,记录下。
请求:
// 接口调用
Service service = new Service();
Call call = (Call) service.createCall();
String url = PropertiesManage.getValue("url");
System.out.println("接口地址: " + url);
call.setTargetEndpointAddress(new URL(url));
call.setOperationName(new QName("TestService", "sendMessage"));
// 添加头信息
String spId = PropertiesManage.getValue("message.header.spId");
QName endReason = new QName("TestService", "EndReason");
call.registerTypeMapping(EndReason.class, endReason, BeanSerializerFactory.class, BeanDeserializerFactory.class);
Name headerName = new PrefixedQName(new QName("RequestSOAPHeader"));
SOAPHeaderElement head = new SOAPHeaderElement(headerName);
head.setActor("");
SOAPElement spIdEle = head.addChildElement("spId");
// 此处省略其他头信息
call.addHeader(head);
// 请求参数格式
QName addresses = new QName("TestService", "URI[]");
call.registerTypeMapping(URI[].class, addresses, ArraySerializerFactory.class, ArrayDeserializerFactory.class);
// 此处省略其他请求参数
call.addParameter("addresses", addresses, ParameterMode.IN);
// 此处省略其他请求参数
call.setReturnType(XMLType.XSD_STRING);
// 短信接收者
URI[] uris = new URI[args.length];
for (int i = 0; i < args.length; i++) {
uris[i] = new URI(args[i]);
System.out.println("消息接收号码: " + args[i]);
}
// 此处省略其他请求参数
// 彩信内容,添加附件
if ("on".equals(PropertiesManage.getValue("message.need"))) {
String fileName = PropertiesManage.getValue("message.content");
System.out.println("彩信内容: " + fileName);
// 由于我获得的是内容的byte[],下面模拟下
// DataHandler dh = new DataHandler(new FileDataSource(fileName));
// 获得的是byte[]
File file = new File(fileName);
byte[] bs = null;
if (file != null) {
FileInputStream fis = new FileInputStream(file);
if (fis != null) {
int len = fis.available();
bs = new byte[len];
fis.read(bs);
}
}
// 由byte[]转换为DataHandler
DataHandler dh = new DataHandler(new ByteArrayDataSource(bs, "application/octet-stream"));
AttachmentPart ap= new AttachmentPart(dh);
ap.setContentId("content");
call.addAttachmentPart(ap);
}
System.out.println("消息发送中...");
// 上面省略了不少参数,如果直接copy,此处报错是必然的
Object ret = call.invoke(new Object[]{uris, sender, sub, MessagePriority.Default, info, request});
if (null == ret) {
System.out.println("Received null ");
throw new AxisFault("", "Received null", null, null);
}
if (ret instanceof String) {
System.out.println("Received problem response from server: " + ret);
}
模拟的处理:
MessageContext msgContext = MessageContext.getCurrentContext();
Message reqMsg = msgContext.getRequestMessage();
FileOutputStream fos = null;
InputStream is = null;
try {
// 获取请求头放置于Map中,由于是模拟,未做特殊处理
SOAPHeader heaader = reqMsg.getSOAPHeader();
SOAPElement element = (SOAPElement)heaader.getChildElements().next();
Map<String, Object> map = new HashMap<String, Object>();
for (Iterator it = element.getChildElements(); it.hasNext();) {
SOAPElement ele = (SOAPElement) it.next();
map.put(ele.getLocalName(), ele.getValue());
}
// 获取附件信息
Attachments attachments = reqMsg.getAttachmentsImpl();
if (null == attachments) {
System.out.println("no attachments");
} else {
Part p = attachments.getAttachmentByReference("content");
if (null == p) {
System.out.println("no attachment, contentid = content");
} else {
DataHandler dh = ((AttachmentPart) p).getDataHandler();
fos = new FileOutputStream("C:/Users/Public/Pictures/Sample Pictures/3.jpg");
int n = 0;
is = dh.getInputStream();
System.out.println(is.available());
while ((n = is.read()) != -1) {
fos.write(n);
}
System.out.println("write to file C:/Users/Public/Pictures/Sample Pictures/3.jpg");
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
return "0k";
分享到:
相关推荐
本案例实现使用Axis2生成.arr包发布WebService服务,并使用Axis2生成客户端代码方式调用WebService
Java Axis 直接调用webservice 接口工具类, 无需根据wsdl编译客户端,需要axis相关包,测试使用axis 1.4, 附demo引入axis包后直接可以测试;
.net调用webservice接口例子.net调用webservice接口例子.net调用webservice接口例子.net调用webservice接口例子
webservice接口调用实例,经个人验证可用
axis调用第三方webservice接口所需的jar包,包括axis-1.4.jar,axis-jaxrpc-1.3.jar,axis-jaxrpc-1.4.jar,commons-discovery-0.5.jar,commons-logging-1.2.jar,cxf-rt-databinding-jaxb-3.3.1.jar,javax.mail-...
超简单的webservice调用demo,对hutool工具进行简单的封装,只需要输入webservice接口名、接口参数即可进行webservice接口调用,欢迎大家吐槽
最近项目中遇到需要去掉老系统的webservice服务中的insert方法,找了很久,发现这样最简单,实测有效!!!
webservice,soap调用, webservice,soap,积分接口调用,qq webservice调用
java 调用https发布的webservice接口实例及axis包及详细说明
使用Java+Axis2调用Web Services 网络接口,代码中列举4个例子可以查看,有详细注释提供参考。
axis2客户端调用axis1服务接口 调用方式 使用RPC方式调用WebService,为了防止冲突可以增加 // 与weblogic的lib冲突配置 System.setProperty("javax.xml.stream.XMLInputFactory", ...
本方法是用axis1.4技术,实现java客户端调用webservice。已经可实现过可行的,如果不行可加我QQ号302633进行详细解析。
利用eclipse,axis2框架,搭建WebService服务端,以及如何调用接口的教程
axis2客户端调用webService接口需要用的jar包,在一次调接口中遇到的问题,亲测可用(整理成了比较精简的jar包)
希望用http协议的能可以帮到大家!很有使用价值!大家可以看看!
Android 利用axis2 调用webservice 包含j2ee服务端代码和Android客户端代码 代码实现包含 List,map ,对象传递
springboot+webservice搭建webservice服务端及使用java客户端两种方式进行调用webservice接口
NULL 博文链接:https://1193605999.iteye.com/blog/2210417
使用WSDL生成webService接口,编写Test调用方法进行测试
纯java调用ws-security+CXF实现的webservice安全接口