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());

你可能感兴趣的:(HttpUrlConnect 响应为空的问题分析)