`
lyw985
  • 浏览: 40029 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用URLConnection传递文件参数,通过SOAP到Webservice

阅读更多
需求:使用URLConnection跟Webservice进行交互,其中有一个数据类型是base64Binary,对应到服务端就是byte[]。

PS:实际上就是文件处理

SOAP的请求文本格式
POST /MyService.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/upload"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <upload xmlns="http://tempuri.org/">
      <bs>base64Binary</bs>
    </upload>
  </soap:Body>
</soap:Envelope>


Server端
       public string upload(byte[] bs){
            return "123";//囧
       }


客户端
sun.misc.BASE64Encoder base64Encoder = new BASE64Encoder();
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
sb
		.append("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">");
sb.append("  <soap:Body>");
sb.append("    <upload xmlns=\"http://tempuri.org/\">");
sb.append("      <bs>");
byte[] bs=FileUtil.getByteArray(new File(""));//取得某个文本的byte数组,具体不写
sb.append(base64Encoder.encode(bs));
sb.append("</bs>");
sb.append("    </upload>");
sb.append("  </soap:Body>");
sb.append("</soap:Envelope>");
URL u = new URL(
		"http://localhost:4638/MyService.asmx");
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setConnectTimeout(60000);
conn.setReadTimeout(60000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setDefaultUseCaches(false);
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestProperty("Content-Length", String.valueOf(sb.toString().length()));
conn.setRequestProperty("SOAPAction", "http://tempuri.org/upload");
conn.setRequestMethod("POST");

OutputStream output = conn.getOutputStream();
if (null != sb) {
	byte[] b = sb.toString().getBytes("utf-8");
	output.write(b, 0, b.length);
}
output.flush();
output.close();

InputStream input = conn.getInputStream();
int c = -1;
while (-1 != (c = input.read())) {
	sb.append((char) c);
}
input.close();
String result = sb.toString().replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll(
		"&quot;", "\"");
System.out.println(result);


中间的尝试过程:
由于一部分是String,一部分是byte数组,所以很是困扰
如果使用new String(byte[] bs)添加条件,会报这个错误
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Illegal character ((CTRL-CHAR, code 17))


如果遍历byte数组,添加每个byte,会报这个错误
java.io.IOException: Invalid header signature; read 0x9EF7F6BDD73DCEE3, expected 0xE11AB1A1E011CFD0

PS:后面的数据不是唯一的,不过就是这样格式的错误


最后发现,byte数组传递时需要转成Base64数据格式
例子如下
normal:This is a Test String
Base64:VGhpcyBpcyBhIFRlc3QgU3RyaW5n


给后人谋求福利~
分享到:
评论
1 楼 shixiuteng 2012-08-24  
我想知道服务端怎么写的。

相关推荐

    使用urlconnection下载文件或图片并保存到本地

    * 使用URLConnection下载文件或图片并保存到本地。 * * @author 老紫竹(laozizhu.com) */ public class URLConnectionDownloader { public static void main(String[] args) throws Exception { ...

    WebService URLConnection request/response JDK1.3

    在这个压缩包文件中,`Test.java`和`T.java`可能是测试类,而`WebServiceTest.java`很可能包含了一个使用URLConnection调用WebService的实际示例。`[转]什么是webservice, 作什么用的.mht`文件可能是一个HTML网页,...

    一个通过Socket或URLConnection传文件的示例

    如果是下载,使用GET请求,通过输入流读取服务器返回的文件数据。 3. **数据传输**:无论是Socket还是URLConnection,都需要处理数据的读写。在Socket中,可以直接操作OutputStream和InputStream;而在...

    JDK中的URLConnection参数详解

    Java JDK 中的 `URLConnection` 是一个非常重要的网络通信接口,它是`java.net.URL`类的主要功能接口,用于打开和管理到互联网对象的连接。在本文中,我们将深入探讨`URLConnection`的一些关键特性和参数,特别是在...

    基于Servlet发送、接收SOAP消息的java源程序

    使用SOAP UI等工具测试服务的可用性和功能,确保消息的正确传递。 通过以上步骤,你可以成功地使用Servlet实现SOAP消息的发送与接收。理解并熟练运用这些知识,将使你在Web服务开发中更加得心应手。

    Java自带的HttpURLConnection访问接口实现文件上传

    在本文中,我们将深入探讨如何使用HttpURLConnection实现文件上传,同时也会涉及普通参数的传递。 首先,我们需要理解HTTP请求的基本结构。HTTP请求通常由以下几个部分组成:请求行、请求头、空行和请求体。在文件...

    使用URL和URLConnection(多线程下载)

    使用URL和URLConnection(多线程下载)

    JS调用WebService.zip

    需要使用soap协议文本。 2,我们可以通过js和urlConnection轻量级的调用服务器方法。 我们之前都是使用服务器提供的类来调用,耦合度较高,服务器的代码改动会造成客户端的代码改动。 3,通过js请求,就是通过...

    webservice 客户端调用公共方法

    在提供的`webservice通用工具类`中,可能包含了一些方便复用的函数,例如封装了上述步骤的`callWebService`方法,它接受XML请求和URL作为参数,返回处理后的响应。这样的工具类简化了开发过程,提高了代码的可维护性...

    URL以及URLConnection的使用

    理解URL的各个组成部分后,我们可以通过`openConnection()`方法获取到与该URL对应的URLConnection对象,它是`java.net.URLConnection`类的实例。URLConnection是Java中连接网络资源的基础,它可以用于读取、写入或...

    例10.03 使用URLConnection对象访问远程文件.rar_remote access java_url_远程文件

    总结,使用`URLConnection`访问远程文件涉及多个步骤,包括创建URL对象,建立连接,设置请求属性,读取或写入数据,并处理响应。通过熟练掌握这些概念和方法,开发者可以构建功能强大的网络应用程序,轻松地与远程...

    java中用URLConnection_类post方式提交表单

    java中用URLConnection类post方式提交表单 java中用URLConnection类post方式提交表单是指在java应用程序中使用java.net....通过本文的讲解,我们可以更好地理解URLConnection类的使用方法和post方式提交表单的原理。

    URLConnection和HttpClient使用入门

    URLConnection和HttpClient使用入门

    客户端页面截取!URLCONNECTION

    在Java编程语言中,我们可以使用多种方法来实现这一功能,其中URLConnection是Java标准库提供的一种网络通信接口,虽然HttpClient更为流行,但URLConnection在某些场景下依然具有实用性。下面我们将深入探讨...

    eclipse中webservice实例运用

    webservice实例运用: 客户端调用webservice的方式: 1、通过wsimport生成客户端代码 2、通过客户端编程的方式调用 3、通过ajax调用js+xml 4、通过URLConnection调用

    通过java.net.URLConnection发送HTTP请求

    通过这个示例,我们可以了解到URLConnection在处理HTTP请求时的基本步骤,包括建立连接、设置请求属性、发送数据以及接收响应。虽然这种方式相对原始且需要更多的手动操作,但在某些特定场景下,直接使用...

    java URL URLConnection

    博客中提到的`WebUrlRequestBuilder.java`文件很可能就是这样一个工具,用于构建和管理网络请求,可能包含了一些高级功能,如设置请求头、添加请求参数、处理响应等。 `WebUrlRequestBuilder`可能包含的方法有: -...

    URLConnection进行网络编程

    在本文中,我们将深入探讨如何使用`URLConnection`进行网络编程,并结合提供的文件"4.3使用URLConnection进行网络编程"和"ConnectionServlet"来构建一个简单的客户端-服务器通信示例。 首先,了解`URLConnection`的...

    UrlConnection连接和Socket连接的区别

    在`Handler.java`这个文件中,可能涉及到Android的消息处理机制,与`UrlConnection`和`Socket`的直接关系不大,但在Android环境中,`Handler`常用于在主线程和工作线程之间同步网络操作的结果,确保UI更新的安全性。...

    java中用URLConnection类post方式提交表单.pdf

    在 doPost() 方法中,我们使用 HttpURLConnection 对象发送 POST 请求,并将参数映射表传递给服务器端。 在我们的示例代码中,我们还使用了 Log4j 来记录日志,以便于调试和错误处理。 下面是该技术的一些关键点:...

Global site tag (gtag.js) - Google Analytics