Android 与 后台网络交互踩坑
Volley
使用json作为数据传输格式进行前后交互,首先使用android官方标配的volley进行数据交互,跟着官方写的demo没什么问题,官方demo地址:
https://developer.android.com/training/volley
但是到自己真正开始使用的时候问题就出现了
我的url如下
String url = "http://172.20.10.4:9091/project_service/getNodes/上海市骨科挂号决策支持";
使用官方提供的方法一直报400错误。一开始以为是防火墙问题,后来把防火墙关了发现问题并没有解决,又想是不是方法用错了,把官方提供的StringRequest、JsonObjectRequest、JsonArrayRequest三个类都尝试了以下发现继续报错,又想到是否是请求头出错,对于Volley 400错误StackOverflow上的最常见解释是忘记在请求头当中加入了如下参数导致出错
headMap.put("Content-Type", "application/json; charset=utf-8");
但是我加入并完善请求头后继续报错,不得不更换工具(其实在高版本的android中调试成功了,我自己的真机环境是android6.0的至少在这个版本或6.0以下版本调试肯定会出错)
以下付一段volley的demo样板
//测试Volley
//编写请求队列
RequestQueue mQueue = Volley.newRequestQueue(this);
String url = "http://172.20.10.4:9091/project_service/getNodes/上海市骨科挂号决策支持";
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(
Request.Method.GET,
url,
null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
// Do something with response
//mTextView.setText(response.toString());
// Process the JSON
Log.e("response",response.toString());
textView.setText(response.toString());
}
},
new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error){
// Do something when error occurred
Log.e("error",error.toString());
textView.setText("don't work");
}
}
){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
// return super.getHeaders();
Map<String,String> headMap = new TreeMap<>();
headMap.put("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
headMap.put("Accept-Encoding","gzip, deflate");
headMap.put("Accept-Language","zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7");
headMap.put("Content-Type", "application/json; charset=utf-8");
headMap.put("Cache-Control","no-cache");
headMap.put("Connection","keep-alive");
headMap.put("Host","192.168.1.102:9091");
headMap.put("Pragma","no-cache");
headMap.put("Upgrade-Insecure-Requests","1");
headMap.put("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36");
return headMap;
}
@Override
public String getBodyContentType() {
return "application/json";
}
};
//设置失败重试
jsonArrayRequest.setRetryPolicy(
new DefaultRetryPolicy
(3000,
3,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
//添加到请求队列
mQueue.add(jsonArrayRequest);
最后我发现了问题所在:在请求的url中出现了中文字符导致请求出错,我测试非中文字符的url进行请求时都没有报错
但是即使找到了错误介于真机版本问题,数据库中出现的中文字符,url中文字符作为参数传递之类种种我决定换一种工具尝试
Http
之后我就找到了okhttp
直接用感觉太过麻烦,在github上找到了okhttp的工具包,十分简洁方便。
使用该util进行请求:
OkHttpUtils
.get()
.url(url)
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e) {
Log.e("Exception",e.toString());
textView.setText(e.toString());
}
@Override
public void onResponse(String response) {
Log.e("response",response);
textView.setText(response);
}
});
经过运行发现准确没有报错。
这个工具包十分方便地址如下:
https://github.com/burgessjp/okhttp-utils
作为在csdn发布的工具包及源码介绍
Android OkHttp完全解析 是时候来了解OkHttp了
https://blog.csdn.net/lmj623565791/article/details/47911083
总结
- 网络中数据交互尽量不要使用中文字符
- 版本问题要注意
- 一个工具不行就尽早换一个