关于网络请求的EOFException的处理。

前言:在项目上线前夕,后台由预发布环境切换到正式环境的时候,android端出现的 一个问题:有的界面不显示了。数据完全没有了。简单的看了看,发现是接口请求出问题了。我这里用的是retrofit+rxjava。我怀疑是因为服务器的某些设置有关,并且向后台提出了质疑-。-因为我对比过前后俩个环境的接口,确实是请求头某些参数设置不同。结果后台人员置之不理。。只好自己动手。我针对其中一个接口,采用HttpURLConnection,抛出了EOFException。,最终请求到了数据,但是接下来在进行gson解析的时候,又出现了问题,不明所以~。关于这个异常:点击打开链接

下面说说我的解决办法,我自己简单的封装了个网络请求

public class NetHttpClient {

    /**
     * 向指定URL发送GET方法的请求
     *
     * @param url     发送请求的URL
     * @param context s上下文
     * @return 请求结果
     */
    public static String sendGet(String url, Context context) {
        StringBuilder result = new StringBuilder();
        HttpURLConnection connection = null;
        URL url1 = null;
        try {
            url1 = new URL(url);
            connection = (HttpURLConnection) url1.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(60000);
            connection.setReadTimeout(60000);
            //此处设置避免出现EOFException
            connection.setRequestProperty("Accept-Encoding", "");
            connection.setRequestProperty("User-Agent","android");
            connection.setRequestProperty("version",PhoneUtils.getVersion(context)+"");
            connection.setRequestProperty("model",PhoneUtils.getSystemModel());
            connection.setRequestProperty("brand",PhoneUtils.getDeviceBrand());
            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream in = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                result = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result.toString();
    }

}
//此处设置避免出现EOFException
            connection.setRequestProperty("Accept-Encoding", "");

设置这个,也是我苦苦搜索找到的解决办法,至于怎么引起的,我怀疑是因为接口的响应头中的设置。响应头中的content-Encoding为:gzip。所以才会有了上面的那一句设置。

这一行确实可以有效避免EOFException。至于另外一个问题,数据解析异常。我实在是到现在也没搞明白为什么,但是我还是解决他了。因为出现问题的接口有好几个,我刚开始是用的原生解析来进行处理。但是这样写起来很麻烦。我又每个都试着用TypeToken来解析,发现还是有的可以有的不可以,但是也可以节省好多代码。具体解析如下:

Gson gson = new Gson();
final List resultBean = gson.fromJson(result,
        new TypeToken>() {
        }.getType());
Log.d("",resultBean.get(0).getMessage());
list = resultBean.get(0).getData().getDatas();

这就是我们需要的数据了。这样就可以轻松拿到,只需要把实体类替换掉!但是其中俩条接口不可以这样处理,返回的数据格式也是一样的,但是没拿到,至今不知道为什么。可以给大家罗列下数据结构:

关于网络请求的EOFException的处理。_第1张图片

至于原生解析的就不贴了。一层一层剥,循环数组拿到需要的数据就可以了。

其实主要还是解决EOFExecption异常,确实起作用了。~

你可能感兴趣的:(关于网络请求的EOFException的处理。)