一、背景介绍
最近因为业务需要,需要在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());