Android开发错误锦囊-Internal Server Error

在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()是个坑,以后不能用这个打印这个参数值,去掉这个就好了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容