如何使用Volley框架在Android端发送携带请求体的GET请求
问题核心
Volley 默认的网络栈实现仅会为 POST、PUT、PATCH 等类型的请求携带请求体,GET 请求默认会忽略 getBody() 方法的返回值,这是源码中明确的逻辑限制,不是你自定义请求类的写法有问题。
可行的两种解决方案
方案1:修改Volley底层逻辑,无需更换库
你需要自定义实现 HttpStack ,重写请求执行逻辑,让GET请求也支持写入请求体:
- 自定义继承自
HurlStack的类,重写executeRequest方法,当检测到GET请求存在非空请求体时,主动设置HttpURLConnection的doOutput = true,并手动将getBody()的内容写入连接输出流。 - 修正你当前自定义请求类中
getBody()的实现错误:你目前用ObjectOutputStream序列化得到的是Java专属的序列化字节流,和你请求头声明的application/json格式不匹配,需要改为将HashMap序列化为JSON字符串后再转字节数组,示例代码:
override fun getBody(): ByteArray { return JSONObject(mRequestObject).toString().toByteArray(Charsets.UTF_8) }
- 初始化Volley请求队列时,传入你自定义的HttpStack即可生效。
注意:部分老旧的反向代理、服务端HTTP实现可能不支持GET请求携带请求体,这属于HTTP实现兼容问题,和客户端逻辑无关。
方案2:更换网络库(更推荐)
如果你的项目允许更换依赖,推荐使用OkHttp或者基于OkHttp封装的Retrofit,二者原生支持GET请求携带请求体,不需要修改底层逻辑,适配成本更低。
内容的提问来源于stack exchange,提问作者Сергей Лысёнок
相关产品推荐
相关产品推荐

