HTTP POST不只能够经过键值对传递参数,还能够携带更为复杂的参数,例如文件。HTTP Post支持携带body,content-type为multipart。本次咱们将尝试经过http post上传一个小文件。web
上传文件的测试环境很难找,下载了Tomcat,想装一个环境,打开后,发现忘得也差很少,要看帮助,比较麻烦,下面是我上传文件到189网盘抓的包,上传一个图片文件,整个content长度为39K。网盘很难做为测试环境的缘由是,咱们必须完成登陆等一系列操做。咱们只是须要验证一下小例子,能够简单经过抓包来判断,预计web server会返回4xx或5xx的错误,但这不影响咱们的实验。apache
可是目前Andriod的HttpClient并不直接支持multipart,咱们须要三个额外的jar来支持:Apache Commons IO,Mime4j,以及HttpMime。能够经过下面地址来下载,也会附到咱们所提供的小例子源代码中。http://commons.apache.org/proper/commons-io/,http://james.apache.org/mime4j/,以及http://hc.apache.org/index.html。这些jar要最终打包在apk中,应用才能在设备中运行。tomcat
在之前的ADT版本中,能够在相应的Project按右键,参见Android学习笔记(四四):第三方Java库的使用。选择Properties,进去后选择Java Build Path,而后选择Libaraies,点击Add External JARs就添加。可是在最新的版本中,采用这种方式在编译中正常,在运行时会报NoClassDefFoundError,以下。工具
缘由是,这些Jar包并无真正打入apk中。在新的ADT,咱们直接将相应的jar包拷贝到project下面的libs/的目录,而后在Eclipse中点击libs/,按右键,选择刷新便可。咱们在libs/和Android Private Libraries/中均可以看到相应的jar,以下图所示:post
若是咱们导入的是最新httpmime-4.3.1.jar,须要将httpcore-4.3.jar同时导入,在接下来的代码编写使用到InputStreamBody数据类型,InputStreamBody会使用到httpcore的类,否者运行时会报org.apache.http.entity.ContentType cannot be resolved的错误。学习
HTTP Post Multipart也是HTTP Post的例子,和以前的小例子相比,只是设置HTTP参数不一样,本例子将设置multipart参数。下面截去例子中的部分,如何读response与以前的相同,再也不重复。测试
private HttpResponse multiPartTest() throws Exception{
try{
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost("http://upload.cloud.189.cn/v5/v5webUploadSmallFileActionl");
//设置HTTP参数,本例设置Multipart参数
//(1)上传文件readme.txt已经放在asset/下,获取该文件的ContentBody。若是是在存贮中某个目录下,能够用FileBody fb = new FileBody(File f)来获得该ContentBody。
InputStream is = this.getAssets().open("readme.txt");
byte[] data = IOUtils.toByteArray(is);
InputStreamBody isb = new InputStreamBody(new ByteArrayInputStream(data), "myUpload");
//(2)除了文件外,咱们再附加两个参数,生成这两个参数的ContentBody
StringBody sb1 = new StringBody("some text goes here");
StringBody sb2 = new StringBody("some text goes here, too");
//(3)做为multipart参数,加入到request中
MultipartEntity multiEntity = new MultipartEntity();
multiEntity.addPart("myUpload", isb);
multiEntity.addPart("one",sb1);
multiEntity.addPart("two",sb2);
request.setEntity(multiEntity); //在上个例子中setEntity()里的参数是UrlEncodedFormEntity本次是MultiPartEntity
return client.execute(request);
}catch(Exception e){
throw e;
}
}ui
回头说说调测环境,咱们在网上找来一个http server,本例是189网盘,向其发送http post multipart请求,因为咱们没有进行网盘用户登陆的过程,而参数也非189所指定,所以收到到404消息的reponse。但咱们能够经过抓包工具来查看各参数的填入状况,来了解如何在Android中填构multipart。本例咱们在multipart entity中加了三个参数,让咱们看看request包。this
若是咱们在机器上状态tomcat apache来搭建测试环境,须要注意的是在模拟器中不能使用127.0.0.1来指向机器的tomcat server,那会指向模拟器自己,要使用网卡的地址。
本博文涉及的例子代码,能够在Pro Android学习:Http service小例子中下载。
相关连接: 个人Android开发相关文章