前言:在项目上线前夕,后台由预发布环境切换到正式环境的时候,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<PGoodInfo> resultBean = gson.fromJson(result,
new TypeToken<List<PGoodInfo>>() {
}.getType());
Log.d("",resultBean.get(0).getMessage());
list = resultBean.get(0).getData().getDatas();
这就是我们需要的数据了。这样就可以轻松拿到,只需要把实体类替换掉!但是其中俩条接口不可以这样处理,返回的数据格式也是一样的,但是没拿到,至今不知道为什么。可以给大家罗列下数据结构:
至于原生解析的就不贴了。一层一层剥,循环数组拿到需要的数据就可以了。
其实主要还是解决EOFExecption异常,确实起作用了。~