如何用soap传递xml文档

如何用soap传递xml文档,第1张

给你一个代码

public class Client {

public static void main(String[] args) {

Service service = new ServiceLocator()

ServiceSoap_PortType serviceSoap = null

try {

serviceSoap = service.getServiceSoap()

} catch (ServiceException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

try {

Properties props = System.getProperties()

props.setProperty("http.proxyHost", "192.168.0.150")

props.setProperty("http.proxyPort", "808")

String[] weathers = serviceSoap.getWeatherbyCityName("北京", TheDayFlagEnum.theDayafterTomorrow)

for (int i=0i<weathers.lengthi++ ) {

System.out.println(weathers[i])

}

} catch (RemoteException e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

}

}

//cmd命令

set AXIS_HOME=D:\apache-tomcat-5.5.17\webapps\axis\WEB-INF

set CLASSPATH=.%AXIS_HOME%\lib\axis.jar%AXIS_HOME%\lib\axis-ant.jar%AXIS_HOME%\lib\commons-discovery-0.2.jar%AXIS_HOME%\lib\commons-logging-1.0.4.jar%AXIS_HOME%\lib\jaxrpc.jar%AXIS_HOME%\lib\log4j-1.2.8.jar%AXIS_HOME%\lib\saaj.jar%AXIS_HOME%\lib\wsdl4j-1.5.1.jar

//weather.xml是你要解析的文件 也可以把weather.xml换成你要解析的xml文件在那个网站里面

java org.apache.axis.wsdl.WSDL2Java -p clientweather weather.xml

上面我们提到过SOAP是基于XML的格式来进行传输的,这边需要指定传输数据的类型;并且指定了数据编码格式为UTF-8(中文乱码)

这边把接口定义的请求格式复制进去,填上必要的参数就可以了;注意的是这边要选择 raw 得方式进行请求,关于它们的区别我在后面会写到。

相当于 Content-Type:multipart/form-data

它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。

相当于 application/x-www-from-urlencoded ,会将表单中的数据以键值对的形式拼接起来;如: name=许渺&gender=0

上传任意格式的文本,比如JSON、XML等

相当于Content-Type:application/octet-stream;用来上传二进制数据,一般是用来上传文件;因为没有键值对所以每次只能上传一个文件。

参考 http://blog.csdn.net/ye1992/article/details/49998511

WebService中文件传输

WebService处理传递普通的信息,还可以传输文件,下面介绍WebService是怎么完成文件传输的。

1、 首先编写服务器端上传文件的WebService方法

package com.hoo.service

import java.io.File

import java.io.FileNotFoundException

import java.io.FileOutputStream

import java.io.InputStream

import javax.activation.DataHandler

/**

* <b>function:</b>Axis WebService完成文件上传服务器端

* @author hoojo

* @createDate Dec 18, 2010 1:16:16 PM

* @file UploadFileService.java

* @package com.hoo.service

* @project AxisWebService

* @blog http://blog.csdn.net/IBM_hoojo

* @email hoojo_@126.com

* @version 1.0

*/

public class UploadFileService {

/**

* <b>function:</b>传递文件

* @author hoojo

* @createDate Dec 18, 2010 1:27:58 PM

* @param handler DataHandler这个参数必须

* @param fileName 文件名称

* @return upload Info

*/

public String upload(DataHandler handler, String fileName) {

if (fileName != null &&!"".equals(fileName)) {

File file = new File(fileName)

if (handler != null) {

InputStream is = null

FileOutputStream fos = null

try {

is = handler.getInputStream()

fos = new FileOutputStream(file)

byte[] buff = new byte[1024 * 8]

int len = 0

while ((len = is.read(buff)) >0) {

fos.write(buff, 0, len)

}

} catch(FileNotFoundException e) {

return "fileNotFound"

} catch (Exception e) {

return "upload File failure"

} finally {

try {

if (fos != null) {

fos.flush()

fos.close()

}

if (is != null) {

is.close()

}

} catch (Exception e) {

e.printStackTrace()

}

}

return "file absolute path:" + file.getAbsolutePath()

} else {

return "handler is null"

}

} else {

return "fileName is null"

}

}

}

上传方法和我们以前在Web中上传唯一不同的就是参数一DataHandler,可以将这类看成文件传输器,他可以把文件序列化。然后通过DataHandler可以得到一个输入流InputStream,通过这个流可以读到文件的内容。其他的 *** 作和普通上传类似。

2、 定制wsdd发布文件上传的WebService服务

<?xml version="1.0" encoding="UTF-8"?>

<deployment xmlns="http://xml.apache.org/axis/wsdd/"

xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<service name="UploadFile" provider="java:RPC">

<parameter name="className" value="com.hoo.service.UploadFileService" />

<parameter name="allowedMethods" value="*" />

<parameter name="scope" value="Session" />

<!-- 和服务器端上传文件的方法签名对应,参数也对应 -->

<operation name="upload" qname="operNS:upload" xmlns:operNS="upload" returnType="rns:string"

xmlns:rns="http://www.w3.org/2001/XMLSchema">

<parameter name="handler" type="ns:DataHandler" xmlns:ns="http://www.w3.org/2001/XMLSchema"/>

<parameter name="fileName" type="ns:string" xmlns:ns="http://www.w3.org/2001/XMLSchema"/>

</operation>

<typeMapping qname="hns:DataHandler" xmlns:hns="ns:FileUploadHandler"

languageSpecificType="java:javax.activation.DataHandler"

serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</service>

</deployment>

上面才xml节点元素在前面都见过了,说明下operation中的参数,注意要指定参数类型,特别是DataHandler的类型,然后就是typeMapping的serializer、deserializer的序列化和反序列化工厂类的配置。

3、 用dos命令发布当前WebService

C:\SoftWare\tomcat-5.0.28\tomcat-5.0.28\webapps\AxisWebService\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deployUpload.wsdd

发布完成后,可以通过这个地址查看uploadFile这个service了

http://localhost:8080/AxisWebService/servlet/AxisServlet

4、 编写客户端代码

package com.hoo.client

import java.rmi.RemoteException

import javax.activation.DataHandler

import javax.activation.FileDataSource

import javax.xml.namespace.QName

import javax.xml.rpc.ParameterMode

import javax.xml.rpc.ServiceException

import org.apache.axis.client.Call

import org.apache.axis.client.Service

import org.apache.axis.encoding.XMLType

import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory

import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory

/**

* <b>function:</b>上传文件WebService客户端

*

* @author hoojo

* @createDate Dec 18, 2010 1:38:14 PM

* @file UploadFileClient.java

* @package com.hoo.client

* @project AxisWebService

* @blog http://blog.csdn.net/IBM_hoojo

* @email hoojo_@126.com

* @version 1.0

*/

public class UploadFileClient {

public static void main(String[] args) throws ServiceException, RemoteException {

String url = "http://localhost:8080/AxisWebService/services/UploadFile"

String fileName = "readMe.txt"

String path = System.getProperty("user.dir") + "\\WebRoot\\" + fileName

System.out.println(path)

//这样就相当于构造了一个带文件路径的File了

DataHandler handler = new DataHandler(new FileDataSource(path))

Service service = new Service()

Call call = (Call) service.createCall()

call.setTargetEndpointAddress(url)

/**

* 注册异常类信息和序列化类 ns:FileUploadHandler 和 wsdd 配置文件中的typeMapping中的xmlns:hns="ns:FileUploadHandler" 的对应 DataHandler

* 和 wsdd 配置文件中的typeMapping中的qname="hns:DataHandler"的DataHandler对应

*/

QName qn = new QName("ns:FileUploadHandler", "DataHandler")

call.registerTypeMapping(DataHandler.class, qn,

JAFDataHandlerSerializerFactory.class,

JAFDataHandlerDeserializerFactory.class)

call.setOperationName(new QName(url, "upload"))

//设置方法形参,注意的是参数1的type的DataHandler类型的,和上面的qn的类型是一样的

call.addParameter("handler", qn, ParameterMode.IN)

call.addParameter("fileName", XMLType.XSD_STRING, ParameterMode.IN)

//设置返回值类型,下面2种方法都可以

call.setReturnClass(String.class)

//call.setReturnType(XMLType.XSD_STRING)

String result = (String) call.invoke(new Object[] { handler, "remote_server_readMe.txt" })

System.out.println(result)

}

}

至此,文件传输就完成了。怎么样,还不错吧!

如果你用myEclipse进行开发的话,运行时可能会出现以下的错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

原因是jar包版本不统一,解决方法如下:

删除Java EE 5 Libraries/javaee.jar/mail里的包有东西.

具体方法如下:

用rar打开X:/Program Files/MyEclipse 6.0/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_6.0.1.zmyeclipse601200710/data/libraryset/EE_5/javaee.jar,然后删除mail,一切就ok了.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12005031.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存