美文网首页
Android开发错误锦囊-Internal Server Er

Android开发错误锦囊-Internal Server Er

作者: 亮之于东 | 来源:发表于2016-10-25 09:00 被阅读153次

    在Android开发中我们经常会遇到上传图片,然而在上传图片的过程中大家很可能会遇到Internal Server Error这个错误,下面我们来看一下这个错误是如何产生的:

    用xutils3上传文件

    1.加入xutils3框架代码

        compile 'org.xutils:xutils:3.3.36'
    

    2.用法

    /**定义请求参数**/
    RequestParams requestParams=new RequestParams("http://10.58.178.120:8080/intco/mobi/member/uploadImage");
            requestParams.addBodyParameter("mId", "1");
            requestParams.addBodyParameter("imgFile", new File(path));
    /**打印请求参数**/
    Log.i("dylan","请求链接:"+params.toString());
      
    /**发起post请求**/
    x.http().post(requestParams, new Callback.CommonCallback<String>() {
    
                    @Override
                    public void onSuccess(String result) {
                            Log.i(TAG, "onSuccess--" + info + "---->" + result);
                        }
                    }
    
                    @Override
                    public void onError(Throwable ex, boolean isOnCallback) {
                        ex.printStackTrace();
                    }
    
                    @Override
                    public void onCancelled(CancelledException cex) {
                    }
    
                    @Override
                    public void onFinished() {
                    }
                });
            }
    

    3.请求结果

    10-19 19:05:07.806 19247-19247/com.bm.ykzx I/NetworkRequest: onError--更换头像---->Internal Server Error
    

    4.结果分析

    我们发现请求并没有成功,而是在xutils的请求回调中只走了onError这个方法的回调,并打印了Internal Server Error,让我们很纳闷,到底是怎么了?问后台服务器,他们说也不知道怎么了。让我们折腾半天,因为iOS是可以上传成功的i,所以,就只能说是我们自己的错误。

    解决思路

    1.发现问题

    我们发现我们和xutils3开源者给的例子就多了一句话,那就是:

    Log.i("dylan","请求链接:"+params.toString());

    就这是调用了一个对象的toString方法会有什么问题呢?
    于是,我们就看一下改对象有没有覆写toString方法呢?
    >```java
    >  /**
         * 在网络请求onStart前, 尽量不要在UI线程调用这个方法, 可能产生性能影响.
         *
         * @return
         */
        @Override
        public String toString() {
            try {
                this.init();
            } catch (Throwable ex) {
                LogUtil.e(ex.getMessage(), ex);
            }
            String url = this.getUri();
            return TextUtils.isEmpty(url) ?
                    super.toString() :
                    url + (url.contains("?") ? "&" : "?") + super.toString();
        }
    >```
    再来看看这个方法面还调用了  super.toString();再接着看
    >```java
    > @Override
        public String toString() {
            checkBodyParams();
            final StringBuilder sb = new StringBuilder();
            if (!queryStringParams.isEmpty()) {
                for (KeyValue kv : queryStringParams) {
                    sb.append(kv.key).append("=").append(kv.value).append("&");
                }
                sb.deleteCharAt(sb.length() - 1);
            }
            if (HttpMethod.permitsRequestBody(this.method)) {
                sb.append("<");
                if (!TextUtils.isEmpty(bodyContent)) {
                    sb.append(bodyContent);
                } else {
                    if (!bodyParams.isEmpty()) {
                        for (KeyValue kv : bodyParams) {
                            sb.append(kv.key).append("=").append(kv.value).append("&");
                        }
                        sb.deleteCharAt(sb.length() - 1);
                    }
                }
                sb.append(">");
            }
            return sb.toString();
        }
    
    >```
    >我们发现在super.toString()里面调用了checkBodyParams();下面我们来看看这个方法:
    >```java
    >
        private void checkBodyParams() {
            if (bodyParams.isEmpty()) return;
            if (!HttpMethod.permitsRequestBody(method)
                    || !TextUtils.isEmpty(bodyContent)
                    || requestBody != null) {
                queryStringParams.addAll(bodyParams);
                bodyParams.clear();
            }
            if (!bodyParams.isEmpty() && (multipart || fileParams.size() > 0)) {
                fileParams.addAll(bodyParams);
                bodyParams.clear();
            }
            if (asJsonContent && !bodyParams.isEmpty()) {
                try {
                    JSONObject jsonObject = null;
                    if (!TextUtils.isEmpty(bodyContent)) {
                        jsonObject = new JSONObject(bodyContent);
                    } else {
                        jsonObject = new JSONObject();
                    }
                    params2Json(jsonObject, bodyParams);
                    bodyContent = jsonObject.toString();
                    bodyParams.clear();
                } catch (JSONException ex) {
                    throw new RuntimeException(ex);
                }
            }
        }
    
    >```
    >在上面的代码中我们发现了这句
    >```java
    >if (!bodyParams.isEmpty() && (multipart || fileParams.size() > 0)) {
                fileParams.addAll(bodyParams);
                bodyParams.clear();
            }
    >```
    ###2.找到问题
    >就是因为这句bodyParams.clear();虽然把参数给我们返回了但是把提交给服务器的参数都清了 
    ###3.总结
      >params.toString()是个坑,以后不能用这个打印这个参数值,去掉这个就好了

    相关文章

      网友评论

          本文标题:Android开发错误锦囊-Internal Server Er

          本文链接:https://www.haomeiwen.com/subject/kpkruttx.html