Android开发错误锦囊-Internal Server Error

2024-05-22 06:58

本文主要是介绍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>() {@Overridepublic void onSuccess(String result) {Log.i(TAG, "onSuccess--" + info + "---->" + result);}}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {ex.printStackTrace();}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic 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方法呢?

 /*** 在网络请求onStart前, 尽量不要在UI线程调用这个方法, 可能产生性能影响.** @return*/@Overridepublic 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();再接着看

@Overridepublic 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();下面我们来看看这个方法:

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);}}}

在上面的代码中我们发现了这句

if (!bodyParams.isEmpty() && (multipart || fileParams.size() > 0)) {fileParams.addAll(bodyParams);bodyParams.clear();}

2.找到问题

就是因为这句bodyParams.clear();虽然把参数给我们返回了但是把提交给服务器的参数都清了

3.总结

params.toString()是个坑,以后不能用这个打印这个参数值,去掉这个就好了

这篇关于Android开发错误锦囊-Internal Server Error的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996000

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.