Android 与 后台网络交互踩坑
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
总结
- 网络中数据交互尽量不要使用中文字符
- 版本问题要注意
- 一个工具不行就尽早换一个
更多相关文章
- Android 中文api (81)――InputMethod [输入法]
- Android修改最小SDK版本(minSdkVersion)
- 如何判断Android系统的版本
- android textview 中超出屏幕宽度的字符 省略号显示
- Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值
- android studio开发安卓应用设置版本号
- 处理固定宽度下的长字符串绘制(Android)
- Android EditText的输入监听,输入字符的动态获取