HttpUrlConnect 响应为空的问题分析
一、背景介绍
最近因为业务需要,需要在android设备中建立服务,用于服务端。
服务端在android设备中,采用NanoHTTPD实现android设备做为服务端。
客户端采用HttpUrlConnect连接服务端,并接受响应信息。
二、 问题介绍
通 过客户端将数据发送到android设备后,客户端需要接收android侧返回的响应数据,以便执行相应操作。
但问题出现了,通过conn.getResponseCode()获取的状态为一直为200,说明执行成功了,但响应信息一直为空;通过postman测试也是可以获取相应信息的。
三、分析问题
1.通过postman可以接收到信息,说明andriod测服务端已经发送信息
2. 客户端侧,通过inputStream = conn.getInputStream()接收的响应信息一直为空
通过分析,虽然客户端已经发送信息,但有可能发送的信息不是客户端想要的
所以需要分析android侧发送的响应信息(此响应信息为其他人创建):
查看响应信息,发现继承的响应信息,通过super,将参数InputStream置空, length置为了0L
正是由于此造成了无法将信息传递给客户端
public class ChildResponse extends Response {
private static final String mimeType ="application/json";
public ChildResponse () {
super(Status.OK, "application/json", (InputStream)null, 0L);
}
public void setFailed() {
this.setStatus(Status.BAD_REQUEST);
}
public void setJSON(String Json) {
this.setData(new ByteArrayInputStream(Json.getBytes(Charset.forName("UTF-8"))));
}
}
解决方法:
在响应信息类中增加一个带InputStream, length的构造方法
说明:此处的inputStream即为HttpUrlConnect的getInputStream所获取的
length为所传递给客户端的数据长度
public ChildResponse (InputStream inputStream, long length) {
super(Status.OK, "application/json", (InputStream)inputStream, length);
}
在业务逻辑中,执行完request请求后,返回响应信息时,通过带参数的构造方法,将响应信息传递给客户端
String responseData = object.toString();
ByteArrayInputStream byteArrayInputStream =new ByteArrayInputStream(responseData.getBytes());
response =new JsonResponse(byteArrayInputStream,responseData.length());
更多相关文章
- Android仿人人客户端(v5.7.1)——主流程(活动)图
- execlp启动android进程命令窗口通过adb shell 进入android 的Lin
- 获取Android 设备信息——build.prop
- android调用隐藏的网络信息设置菜单实现
- Android 为 Android 开发访问 JAX-RS Web 服务的 Apache HttpCli
- 【博客园客户端】博客园Android客户端更新:离线下载、本地收藏、R
- Android客户端通过socket与服务器通信
- 《Android/OPhone开发完全讲义》连载(5):Notification与状态栏信息
- 面向UDP的Android——PC双向通信(一):实现Android客户端和PC服务器