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

总结

  • 网络中数据交互尽量不要使用中文字符
  • 版本问题要注意
  • 一个工具不行就尽早换一个
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值