四处踩坑的http通讯

说下今天所遇到的坑,免得以后再犯,抑或以后犯了能更快解决吧。

项目需要传输数据以及图片到服务端,由于有文件上传,因此去下载了httpmime,到http://download.csdn.net/download/lamphogani/8347927这里下载了个4.3.6,大致使用了下:

MultipartEntityBuilder meb= MultipartEntityBuilder.create();

meb.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
meb.addTextBody("projectID", projectID);
meb.addBinaryBody(String.valueOf(index), new File(path));

HttpEntity e = meb.build(); 

可是运行时在addTextBody处报错Java.lang.NoClassDefFoundError,搞了很久没搞明白,随后换成了以前项目用过的4.1.3版本http://pan.baidu.com/s/1ceIV06。但是4.1.3并不支持MultipartEntityBuilder,因此代码也做了相应变动。

代码也切换成:

MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("projectID", new StringBody(projectID, Charset.forName("UTF-8")));

首先HttpMultipartMode.BROWSER_COMPATIBLE表明表单的形式;关于中文乱码问题,网上有教程直接new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null, Charset.forName("UTF-8")),可是服务器那边会报错:unrecognized content-type:multipart/form-data; boundary=kh9_c9ixtj_--vqaf8xaiyeqk3rotrgiqm3; charset=utf-8,之后改为在new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);,并在addPart时主动添加Charset.forName("UTF-8"),服务器没有报错并且没有出现乱码情况。

随后又关于遇到array格式问题:

List<String> list = new ArrayList<String>();
list.add("手动输入");
list.add("admin");
multipartEntity.addPart(String.valueOf(index), new StringBody(new Gson().toJson(list), Charset.forName("UTF-8")));

服务器接收为:1:"["手动输入","admin"]",解析array失败了,他需要的格式是:1:["手动输入","admin"]。随后尝试发现直接

multipartEntity.addPart(String.valueOf(index), new StringBody("手动输入", Charset.forName("UTF-8")));

multipartEntity.addPart(String.valueOf(index), new StringBody("admin", Charset.forName("UTF-8")));

可以实现服务器所需格式;其中如果StringBody的内容为""时,会被自动去掉,因此如果把“admin”换成"",那服务器就只会接收到一个“手动输入”。

关于上传图片问题:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeFile(path);
bitmap.compress(CompressFormat.JPEG, 75, bos);
byte[] b = bos.toByteArray();
ByteArrayBody bab = new ByteArrayBody(b, file.list()[0]);
multipartEntity.addPart(String.valueOf(index), bab);这是网上的一种写法,实现了功能。随后发现可以直接
multipartEntity.addPart(String.valueOf(index), new FileBody(new File(path)));挺方便的。

总结
出错的原因和解决方法的原理了解不透彻,还得进一步深入。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值