Android 发送Post请求上传图片(以InputStream为数据交互)

最近在做项目,涉及到修改头像的功能,理论上是很简单的需求,但是由于底层的数据交互以InputStream流的形式而踩了一些坑,记录下来,帮助后来人少踩坑。

先说下背景:项目需求为从相册选取图片,然后以InputStream的方式作为Http的body传递给服务端,服务端直接解析Body的内容获取图片。网络交互采用HttpClient进行,将修改头像的请求封装为request对象。

简单介绍实现思路:
1) 从相册获取图片(PNG或者JPEG格式)
2) 将图片转化为Bitmap格式
3) 压缩图片(采用JPEG格式压缩,压缩效率远高于对PNG格式压缩),获取ByteArrayOutputStream流
4) 转化为InputStream流向服务端传递

好了,运行一下试试:

报了一个Json解析的错误,用Fiddler抓包,看Response是什么东西:

并没有返回一个标准的JSON格式数据,报了一个错,411 Length Required 错,google下这个错误,得到了下面的信息:

说的很清楚,当使用InputStream作为数据交互对象作 为Http的body传递,服务端无法评估body的长度,因而会造成 transfer mode =chunked ,服务端不会接受这个数据传递的请求。
同样,说了如何解决这个问题:
1,就设置下content-length的大小;
2,别使用InputStream进行数据交互,改用一个字节数组;

用Fiddler再看一下这个请求的基本信息,和上面说的一致:

受限于项目使用的底层请求框架,采用解析InputStream的方式,因而采用方法一,设置下Content-length

设置好后再抓包看看:

数据返回回来了。

总结一下,本文主要说明一个问题:
当以InputStream为数据交互对象,作为Http的Body传递给服务器,客户端要设置Content-length,否则服务器不会解析该请求。

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. 开发者眼中的Android手机平台
  5. 较深入的分析Content Providers用法
  6. 使用OpenGLES 在 android 上显示摄像头滤镜效果
  7. Android读书笔记-2 序列化
  8. 关于Android中aidl的关键词in,out,inout的探索
  9. Android(安卓)RxJava操作符详解 系列:组合 / 合并操作符

随机推荐

  1. Android改包1
  2. 关于Activity的onSaveInstanceState调用
  3. Android(安卓)隐藏软键盘的方式
  4. IllegalThreadStateException in LunarLa
  5. android 手机项目集成高德地图的坑(小白请
  6. Android(安卓)7.1 导航栏增加按键, 关机
  7. android Studio遇到transformClassesWith
  8. Androud 如何区分USB设备
  9. Android(安卓)PopupWindow 使点击区域外
  10. Android(安卓)Studio 4.0 新功能之Live L