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

总结

  • 网络中数据交互尽量不要使用中文字符
  • 版本问题要注意
  • 一个工具不行就尽早换一个

更多相关文章

  1. Android 中文api (81)――InputMethod [输入法]
  2. Android修改最小SDK版本(minSdkVersion)
  3. 如何判断Android系统的版本
  4. android textview 中超出屏幕宽度的字符 省略号显示
  5. Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值
  6. android studio开发安卓应用设置版本号
  7. 处理固定宽度下的长字符串绘制(Android)
  8. Android EditText的输入监听,输入字符的动态获取

随机推荐

  1. android 自定义Toast 显示时长 样式
  2. Android设置中的Preferencescreen用法介
  3. Eclispe中的ArcGIS Android(安卓)SDK更新
  4. android菜鸟学习笔记1----环境搭建
  5. Android系统启动流程 -3
  6. 【安卓笔记】BroadcastReceiver
  7. Eclipse在线安装ADT等Android插件连接不
  8. ubuntu下android真机调试
  9. android显示意图激活另一个Activity的方
  10. Android(安卓)开发